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