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