Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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 BigDecimal if语句不适用于!操作人员_Java_Comparison_Bigdecimal - Fatal编程技术网

Java BigDecimal if语句不适用于!操作人员

Java BigDecimal if语句不适用于!操作人员,java,comparison,bigdecimal,Java,Comparison,Bigdecimal,我有两个bigdecimal,value1和value2。我想用value1除以value2,但如果其中一个为零,显然我不想这样做。所以我写了这个简单的if语句: if(!value1.equals(0) && !value2.equals(0)){ divide value1 by value2 blah blah blah } 由于某种原因,这个if语句不起作用。。即使其中一个值等于零,方程仍然会被计算,给我一个错误,因为我试图用零除或除以零。 我知道我可以使用valu

我有两个
bigdecimal
value1
value2
。我想用
value1
除以
value2
,但如果其中一个为零,显然我不想这样做。所以我写了这个简单的if语句:

if(!value1.equals(0) && !value2.equals(0)){
  divide value1 by value2 blah blah blah
}
由于某种原因,这个if语句不起作用。。即使其中一个值等于零,方程仍然会被计算,给我一个错误,因为我试图用零除或除以零。
我知道我可以使用
value1.compareTo(BigDecimal.valueOf(0)==1
得到我想要的结果,但我只是好奇为什么我的第一个方法不起作用。

Java将不同类型的对象视为不同的对象。这意味着,即使它们表示的是等价的东西,它们也不相同

BigDecimal的“特殊”之处在于,即使类型相同且值相等,但具有不同的刻度,它们仍然不是“相等”

印刷品

0.0 equals 0 is false
0.00 equals 0.0 is false
0.00 equals 0.00 is true
0.00 equals 0.000 is false
0.00 compareTo 0 is 0
0.000 compareTo 0 is 0
解决这个问题的方法是使用compareTo,它可以根据比例进行调整,并为您提供更自然的比较

System.out.println(bd2 + " compareTo " + BigDecimal.ZERO + " is " + (bd2.compareTo(BigDecimal.ZERO )));
System.out.println(bd3 + " compareTo " + BigDecimal.ZERO + " is " + (bd3.compareTo(BigDecimal.ZERO )));
印刷品

0.0 equals 0 is false
0.00 equals 0.0 is false
0.00 equals 0.00 is true
0.00 equals 0.000 is false
0.00 compareTo 0 is 0
0.000 compareTo 0 is 0
这意味着如果要使用BigDecimal,则需要编写

if(value1.compareTo(BigDecimal.ZERO) != 0 && value2.compareTo(BigDecimal.ZERO) != 0) {
就个人而言,我更喜欢使用
double
,它更简单、更快。唯一的缺点是你必须自己管理舍入

double div = value1 / value2;
if (0 < div && div < SOME_UPPER_SENSIBLE_LIMIT) {
   // division was ok.
   System.out.printf("%.4f", div); // print with rounding.
double div=value1/value2;
if(0
Java将不同类型的对象视为不同的对象。这意味着,即使它们表示相同的对象,它们也不相同

BigDecimal的“特殊”之处在于,即使类型相同且值相等,但具有不同的刻度,它们仍然不是“相等”

印刷品

0.0 equals 0 is false
0.00 equals 0.0 is false
0.00 equals 0.00 is true
0.00 equals 0.000 is false
0.00 compareTo 0 is 0
0.000 compareTo 0 is 0
解决这个问题的方法是使用compareTo,它可以根据比例进行调整,并为您提供更自然的比较

System.out.println(bd2 + " compareTo " + BigDecimal.ZERO + " is " + (bd2.compareTo(BigDecimal.ZERO )));
System.out.println(bd3 + " compareTo " + BigDecimal.ZERO + " is " + (bd3.compareTo(BigDecimal.ZERO )));
印刷品

0.0 equals 0 is false
0.00 equals 0.0 is false
0.00 equals 0.00 is true
0.00 equals 0.000 is false
0.00 compareTo 0 is 0
0.000 compareTo 0 is 0
这意味着如果要使用BigDecimal,则需要编写

if(value1.compareTo(BigDecimal.ZERO) != 0 && value2.compareTo(BigDecimal.ZERO) != 0) {
就个人而言,我更喜欢使用
double
,它更简单、更快。唯一的缺点是你必须自己管理舍入

double div = value1 / value2;
if (0 < div && div < SOME_UPPER_SENSIBLE_LIMIT) {
   // division was ok.
   System.out.printf("%.4f", div); // print with rounding.
double div=value1/value2;
if(0
改用这个

  if(BigDecimal.ZERO.compareTo(value1) != 0 && BigDecimal.ZERO.compareTo(value2) != 0) 
  {
     ....
  }
equals
将不起作用

选中此项:
公共布尔等于(对象x)
将此BigDecimal与指定对象进行相等比较。与compareTo不同,此方法仅当两个BigDecimal对象的值和比例相等时才认为它们相等(因此,使用此方法进行比较时,2.0不等于2.00)。

请改用此方法

  if(BigDecimal.ZERO.compareTo(value1) != 0 && BigDecimal.ZERO.compareTo(value2) != 0) 
  {
     ....
  }
equals
将不起作用

选中此项:
公共布尔等于(对象x)

将此BigDecimal与指定对象进行相等比较。与compareTo不同,此方法仅当两个BigDecimal对象的值和比例相等时才认为它们相等(因此,使用此方法进行比较时,2.0不等于2.00).

在执行value1/value2时,需要检查value2是否为零或不进行除法,如果value1为零,则结果为零。从您使用的方法的javadoc中可以看出:“当且仅当指定对象是一个BigDecimal,其值和比例等于此BigDecimal时,才为true。”。当一个方法给出意外结果时,请检查其文档。为了将来的参考,请始终尝试提供。在相当简单的
if
条件中有2个语法错误。在执行value1/value2时,您需要检查value2是否为零或不进行除法,如果value1为零,则结果为零。从该方法的javadoc中,您可以了解e:“当且仅当指定的对象是一个BigDecimal,其值和比例与此BigDecimal的值和比例相等时为true。”。当一个方法给出意外结果时,请检查其文档。为便于将来参考,请始终尝试提供一个。在相当简单的
if
条件中有2个语法错误。