Java:双值比较
我们在比较双精度值和零时需要小心吗Java:双值比较,java,double,Java,Double,我们在比较双精度值和零时需要小心吗 if ( someAmount <= 0){ ..... } 如果(someAmount取决于someAmount的计算方式,则可能会出现浮点/双精度的奇怪行为 基本上,使用浮点/双精度将数字数据转换为二进制表示容易出错,因为有些数字不能用螳螂/指数表示 有关这方面的一些细节,您可以阅读 你应该考虑使用java java语言。 double epsilon = 0.0000001; if ( f <= ( 0 - epsilon )
if ( someAmount <= 0){
.....
}
如果(someAmount取决于someAmount
的计算方式,则可能会出现浮点/双精度的奇怪行为
基本上,使用浮点/双精度将数字数据转换为二进制表示容易出错,因为有些数字不能用螳螂/指数表示
有关这方面的一些细节,您可以阅读
你应该考虑使用java java语言。
double epsilon = 0.0000001;
if ( f <= ( 0 - epsilon ) ) { .. }
else if ( f >= ( 0 + epsilon ) ) { .. }
else { /* f "equals" zero */ }
double epsilon=0.0000001;
如果(f=(0+ε)){..}
否则{/*f“等于”零*/}
或者,您可以简单地将双精度四舍五入到某个指定的精度,然后再对其进行分支
有关比较浮点数错误的一些有趣细节,请注意自动取消装箱:
Double someAmount = null;
if ( someAmount <= 0){
Double someAmount=null;
如果(某个数量表示相等:(即=
或!=
)是
对于其他比较运算符(
,=
),这取决于您是否关心边缘情况,例如,如果您不关心边缘情况,则只需测试某个量检查双精度或浮点值是否为0,使用错误阈值来检测值是否接近0,但不完全为0。我认为此方法是我遇到的最好方法
由@William Morrison回答
上述示例代码的结果为true、true和false
玩得开心@
是的,你应该小心
建议:一个好方法是使用BigDecimal
检查0的相等/不相等:
BigDecimal balance = pojo.getBalance();//get your BigDecimal obj
0 != balance.compareTo(BigDecimal.ZERO)
说明:
compareTo()
函数将此BigDecimal
与指定的BigDecimal
进行比较。两个BigDecimal
对象的值相等,但比例不同(如2.0和2.00)此方法认为是相等的。对于六个布尔
比较运算符(,>=,!=,有趣的文章,此方法优先于单独的方法提供,但似乎有点过时。我喜欢这句话:“在大多数计算机中,浮点运算通常比整数运算慢得多,但在英特尔奔腾上,浮点运算通常要快得多,因为整数单元没有得到与浮点单元相同的注意。”@放松:但这几乎是唯一不再相关的部分。从那时起,除了性能之外的所有内容都保持不变。请参阅。这并非完全正确。在使用浮点计算时,肯定有更多操作会导致值不精确。例如,0.3-0.2-0.1的计算结果不会精确到0,但r到-0.00000000000000002775575615628914,这反过来又是!=0几乎任何浮点运算都会产生令人困惑的结果。加减法当然可以做到这一点,尤其是当数字被加(或减)时处于非常不同的极端,例如1e10+1e-10。如果合适,请使用BigDecimal。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,则仅链接的答案可能无效。无论您的意图是什么,如果希望您的代码在我看来,你绝对不应该写这样的双重比较。总是使用EPSILON或BigDecimal
System.out.println(isZero(0.00, 0));
System.out.println(isZero(0, 0));
System.out.println(isZero(0.00001, 0));
BigDecimal balance = pojo.getBalance();//get your BigDecimal obj
0 != balance.compareTo(BigDecimal.ZERO)
float f = 0.1; // 0.100000001490116119384765625
double d = 0.1; // 0.1000000000000000055511151231257827021181583404541015625