C#浮动神奇地改变了价值

时间:2010-12-27 23:25:37

标签: c# floating-point


我有一个非常重要的浮动值,必须非常精确 我遇到的问题是我正在改变浮点数的值ALWAYS只有+和 - (这里没有除法)。
更改值约20次后,该值不是0.05,正如预期的那样,为0.0499989。这是为什么?我没有施放漂浮物,我不是它,但它神奇地从0.05变为0.049989。我尝试Math.Round(value, 2);但它也没有返回0.05。我现在该怎么办?

4 个答案:

答案 0 :(得分:9)

许多(如果不是大多数)语言中的浮点变量仅包含实际值的不精确近似值。您可以使用decimal数据类型在C#中解决问题。 See this SO question.

答案 1 :(得分:4)

Float和double值存储在二进制(base 2)中 因此,它们无法准确地表示像.3这样的数字,这些数字在二进制中没有有限长度表示。

类似地,存储在基数10中的decimal无法准确表示像{​​{1}}这样的数字,这些数字没有十进制的有限长度表示。

您需要一个任意精度的算术库。

答案 2 :(得分:2)

问题是浮点数不能准确表示一些小数。如果你只使用+和 - ,请考虑使用十进制数据类型,你不应该有这个问题,因为decimal在内部使用了一个基数。

答案 3 :(得分:2)

就像int变量只能保存某个范围内的整数一样,float只能保存某些值。 0.05不是其中之一。

如果将int变量设置为(比方说)3.4,它实际上不会保持值3.4;它会将该值转换为可表示的int值:3。

同样,如果您将float变量设置为0.05,则不会获得该确切的值;它会将该值转换为可表示为float的最接近的值。这就是你所看到的。