Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:双值比较_Java_Double - Fatal编程技术网

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