【发布时间】:2021-03-29 19:54:59
【问题描述】:
我赚了一小笔代码更改钱,但我有一个小问题
代码是这样的
Dim moneyHelper As Double
moneyHelper = 1.9
While moneyHelper > 0
If moneyHelper > 25 Then
Else If moneyHelper > 10 Then
Else If moneyHelper > 5 Then
Else If moneyHelper > 1 Then
console.WriteLine("change $1 x " + Math.Floor(moneyHelper/1).ToString)
moneyHelper = moneyHelper - (Math.Floor(moneyHelper/1)*1)
console.WriteLine("result after $1: " + moneyHelper.ToString)
Else If moneyHelper > 0.5 Then
console.WriteLine("change $0.5 x " + Math.Floor(moneyHelper/0.5).ToString)
moneyHelper = moneyHelper - ( Math.Floor(moneyHelper/0.5)*0.5)
console.WriteLine("result after $0.5: " + moneyHelper.ToString)
Else If moneyHelper > 0.1 Then
console.WriteLine("change $0.1 x " + Math.Floor(moneyHelper/0.1).ToString)
moneyHelper = moneyHelper - ( Math.Floor(moneyHelper/0.1)*0.1)
console.WriteLine("result after $0.1: " + moneyHelper.ToString)
End If
End While
但是结果是这样的
change $1 x 1
result after $1: 0.9
change $0.5 x 1
result after $0.5: 0.4
change $0.1 x 3
result after $0.1: 0.0999999999999999
更改后,结果应为 0 和更改 $0.1x4,但改为 0.0999999999999999 和更改 $0.1x3。我不知道为什么。
如果你们能提供任何帮助,我将不胜感激!谢谢你
【问题讨论】:
-
我记得在某处读到
Double类型遇到舍入错误。改为使用Decimal,你应该没问题。谷歌指出了几个涵盖这个问题的链接 - google.co.uk/search?q=.net+double+rounding+errors -
我试图转换十进制但我有同样的问题
console.WriteLine("change $1 x " + (Math.Floor(moneyHelper/1.0)*1.0).ToString) -
1.0 是
Double,您可能希望1.0D确保在不进行任何转换的情况下使用小数完成数学运算。 -
向@JayV 发表评论,也尝试搜索“每个计算机科学家都应该了解的浮点知识”。我还建议阅读 Bruce Dawson 关于浮点格式的博客系列。