为了账号安全,请及时绑定邮箱和手机立即绑定

检查浮点值是否等于0是否安全?

检查浮点值是否等于0是否安全?

30秒到达战场 2019-10-17 14:50:55
我知道您通常不能依赖双精度或十进制类型值之间的相等性,但是我想知道0是否是特例。虽然我可以理解0.00000000000001和0.00000000000002之间的不精确性,但0本身似乎很难弄乱,因为它什么也没有。如果您对某事一无所知,那就再也不是什么了。但是我对这个话题不太了解,所以我不必说。double x = 0.0;return (x == 0.0) ? true : false;那会永远返回true吗?
查看完整描述

3 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

它是安全的期望,比较将返回true当且仅当双变量具有完全相同的值0.0(在你原来的代码片段,当然,这种情况)。这与==操作符的语义一致。a == b表示“ a等于b”。

当在纯数学中相同计算的结果为零时,期望某种计算的结果在双精度(或更普遍地为浮点数)算法中为零是不安全的(因为它是不正确的)。这是因为当计算深入时,会出现浮点精度误差-这个概念在数学的实数运算中不存在。


查看完整回答
反对 回复 2019-10-17
?
不负相思意

TA贡献1777条经验 获得超10个赞

如果您需要进行大量“相等”比较,则最好在.NET 3.5中编写一些辅助函数或扩展方法以进行比较:


public static bool AlmostEquals(this double double1, double double2, double precision)

{

    return (Math.Abs(double1 - double2) <= precision);

}

可以通过以下方式使用此方法:


double d1 = 10.0 * .1;

bool equals = d1.AlmostEquals(0.0, 0.0000001);


查看完整回答
反对 回复 2019-10-17
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

对于您的简单样本,该测试还可以。但是呢:


bool b = ( 10.0 * .1 - 1.0 == 0.0 );

请记住,.1是二进制的重复十进制数,不能精确表示。然后将其与以下代码进行比较:


double d1 = 10.0 * .1; // make sure the compiler hasn't optimized the .1 issue away

bool b = ( d1 - 1.0 == 0.0 );

我将让您进行测试以查看实际结果:您更有可能以这种方式记住它。


查看完整回答
反对 回复 2019-10-17
  • 3 回答
  • 0 关注
  • 508 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信