2017-11-03 121 views
0

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分裂将导致+/-InfinityNaN中间值?

回答

0

由于二进制表示小数的行为,我们应该避免测试等于float。

你问的问题基本上是否,上面的代码工作? 取决于如何f使用,特别是如果你没有明确0.0传递作为参数,而是做这样的事情f((0.4-0.1)-0.3),它不会被一个小数0

附言:非常接近赶上和鸿沟如果你想要十进制精度,使用BigDecimal。