vb.net - 如何解决VB.Net中的数学错误?
问题描述
我在 vb.net 中遇到数学错误。
甚至在我的旧项目中尝试过 vb6。
甚至在 NodeJs 中尝试过。(问朋友)
我正在做一个简单的事情。
Msgbox(3.28 - 3.2)
这向我显示了 0.79999999999996(不知道中间有多少个 9,但肯定有这么多。)
即使尝试了Msgbox(Format(3.28 - 3.2,"0.00"))
仍然相同的答案。
在我的 Vb6 项目中,我得到 7.9999999999996E-02 的东西。
在我朋友的 nodejs 中也得到相同的 0.7999…96
我需要在 vb.net 所以尝试使用Format
但没有正确的答案。也许以错误的方式使用格式。
怎么做才能得到 0.08 ?
解决方案
如果用户以 10 为底输入数字,并且计算结果以 10 为底显示给用户,那么您应该将值存储在Decimal
变量中而不是Single
或Double
变量中。 Decimal
以base-10(十进制)浮点格式存储数字,而Single
andDouble
以base-2(二进制)浮点格式存储数字。因此,如果输入和输出都是以 10 为底的,那么以 10 为底的浮点变量将为您提供更多预期的结果。
' Outputs "0.0799999999999996" because the literals are Double by default
Console.WriteLine(3.28 - 3.2)
' Outputs "0.08" because the D suffix forces the compiler to interpret the literals as Decimal
Console.WriteLine(3.28D - 3.2D) ' Outputs
浮点数总是不精确的,因为当它是一个重复的小数时,不可能以数字格式准确地表示一个值——在某些时候你必须停止重复并将它四舍五入。问题是,哪些数字无限重复取决于您使用的基数,因此通过在基数之间切换,您可以使值以您不一定期望的方式四舍五入。因此,例如,即使使用Decimal
,您仍然可以获得不精确的结果,但至少在进行以 10 为底的数学运算时,它们会按照您期望的舍入方式进行舍入:
' Outputs "0.6666666666666666666666666667"
Console.WriteLine(2D / 3D)