在Java中检查两个BigDecimal的倍数和模块

时间:2018-09-05 07:30:35

标签: java double bigdecimal

BigDecimal x = new BigDecimal(1.95);
BigDecimal y = new BigDecimal(0.65);

BigDecimal rem = x.remainder(y);
if (rem.compareTo(BigDecimal.ZERO) != 0.) {
    System.out.println("Not In mutilple of");
} else {
    System.out.println("In mutilple of");
}
System.out.println(rem);
  

对于上述情况未给出正确的结果。   给定输入条件,但如果是第二个值的倍数则给出错误的结果

2 个答案:

答案 0 :(得分:8)

说明

使用new BigDecimal(double)可能会降低精度,请参见doc

  

此构造函数的结果可能有些不可预测。一   可能假设用Java编写新的BigDecimal(0.1)会创建一个   BigDecimal恰好等于0.1(非标度值为1,其中   比例为1),但实际上等于   0.1000000000000000055511151231257827021181583404541015625。这是因为0.1不能精确地表示为双精度(或为此   物质,作为任何有限长度的二进制分数)。因此,价值   传递给构造函数的值不完全等于   0.1,尽管出现。

和:

BigDecimal x= new BigDecimal(1.95);
BigDecimal y = new BigDecimal(0.65);

System.out.println(x); // 1.9499999999999999555910790149937383830547332763671875
System.out.println(y); // 0.65000000000000002220446049250313080847263336181640625

解决方案

使用BigDecimal(String val)

  

另一方面,String构造函数是完全可预测的:   编写新的BigDecimal(“ 0.1”)会创建一个BigDecimal,它正好是   就像人们期望的那样等于0.1。因此,通常   建议优先使用String构造函数   一个。

BigDecimal x = new BigDecimal("1.95");
BigDecimal y = new BigDecimal("0.65");

System.out.println(x);  // 1.95
System.out.println(y);  // 0.65
System.out.println(x.remainder(y)); // 0.00

答案 1 :(得分:5)

实例化

BigDecimal x= new BigDecimal("1.95");
BigDecimal y= new BigDecimal("0.65");

并非所有浮点数都可以精确表示为double

代码中的输出显示 0.65 ss 0.64999999999999995559107901499373838305473327636718750

请参阅https://study.com/academy/lesson/java-floating-point-numbers.html