【发布时间】:2011-08-19 20:36:02
【问题描述】:
在 .net 中直接比较浮点数(double, float) 是否相等是不安全的。变量中的双精度值可能会随着时间的推移而发生非常小的变化。例如,如果您将一个对象的变量 num(double) 设置为 0.2,则该对象在内存中等待一段时间后,您可能会发现 num 变为 0.1999999999999。所以 num == 0.2 在这种情况下将是错误的。我对这个问题的解决方案是创建一个属性来舍入数字:
double Num
{
get{ return Math.Round(num, 1); }
}
Num的get被调用并返回结果后,这个返回的数字在比较的时候是否可以再次变为0.19(Num == 0.2)?这不太可能,但可以保证吗?
【问题讨论】:
-
FWIW:变量中的值不会改变从 0.2 到 0.19999999999(即,随着时间的推移,它不会泄漏或流失或丢失一些位)。事实是 0.2 根本无法在二进制浮点变量中精确表示,因此它被存储为 double 或 float 可以表示的最接近的可能值。这就是为什么你会得到像 0.199999999999 或 0.20000000001 这样的东西。
标签: .net comparison floating-point