比较分母== 0.0d以防止被零除是否正确?
问题描述:
SonarQube有一个rule报告下面的代码中的一个错误,指出“浮点数不应测试相等性”。通常这个规则是有道理的,但在这种情况下,这似乎是一个误报。如果是这样,我想这样标记它,而不是用Double.compare
构造来解决它,检查中间结果+/-Infinity
,NaN
或类似的东西。比较分母== 0.0d以防止被零除是否正确?
public void f(double denominator)
{
if (denominator == 0.0d)
throw new IllegalArgumentException("Division by zero.");
// code that involves division by denominator ...
}
因此,问题:是否上面的代码抛出IllegalArgumentException
当且仅当(只有在含有double
表示方法)通过denominator
分裂将导致+/-Infinity
或NaN
中间值?
答
由于二进制表示小数的行为,我们应该避免测试等于float。
你问的问题基本上是否,上面的代码工作? 取决于如何f
使用,特别是如果你没有明确0.0传递作为参数,而是做这样的事情f((0.4-0.1)-0.3)
,它不会被一个小数0
附言:非常接近赶上和鸿沟如果你想要十进制精度,使用BigDecimal。