首页 > 解决方案 > 如何解决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 ?

标签: vb.net

解决方案


如果用户以 10 为底输入数字,并且计算结果以 10 为底显示给用户,那么您应该将值存储在Decimal变量中而不是SingleDouble变量中。 Decimal以base-10(十进制)浮点格式存储数字,而SingleandDouble以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)

推荐阅读