如何解决VB.Net中的数学错误?

时间:2019-05-16 17:46:57

标签: vb.net

我在vb.net中遇到数学错误。
甚至在我的旧项目中在vb6中尝试过。
甚至在NodeJs中尝试过。(问了一个朋友)
我在做简单的事情。

$placeId = 'b4b8adfb46dfbabdf864b';
$user->places->contains(function ($place) use ($placeId) {
    return $place->place_id == $placeId;
});

这告诉我0.79999999999996(不知道中间有多少个9,但是肯定有很多。)
甚至尝试过Msgbox(3.28 - 3.2) 答案还是一样。

在我的Vb6项目中,我得到了7.9999999999996E-02。

在我的朋友的nodejs中,也得到了相同的0.7999…96

我需要在vb.net中使用Msgbox(Format(3.28 - 3.2,"0.00"))尝试,但没有正确的答案。也许以错误的方式使用格式。

如何获得0.08?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:-1)

这是由于浮点算术近似值。这可以通过使用System.Decimal.Round

来解决
Decimal.Round(0.575, 2, MidpointRounding.AwayFromZero)

结果:0.58