在java中检查两个BigDecimal的Multiple和模块

问题描述 投票:2回答:2
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);

没有给出上述场景的正确结果。给定输入条件但如果它是第二个值的倍数则给出不正确的结果

java double bigdecimal
2个回答
8
投票

说明

使用qazxsw poi可能会失去精确度,请参阅qazxsw poi:

这个构造函数的结果可能有点不可预测。有人可能会假设在Java中编写新的BigDecimal(0.1)会创建一个BigDecimal,它恰好等于0.1(未缩放值为1,标度为1),但它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1不能精确地表示为double(或者,就此而言,作为任何有限长度的二进制分数)。因此,传递给构造函数的值并不完全等于0.1,尽管有外观。

和:

new BigDecimal(double)

使用doc

另一方面,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.9499999999999999555910790149937383830547332763671875
System.out.println(y); // 0.65000000000000002220446049250313080847263336181640625

5
投票

实例化如

BigDecimal(String val)

因为并非所有浮点数都可以完全表示为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 s。

代码中的输出显示BigDecimal x= new BigDecimal("1.95"); BigDecimal y= new BigDecimal("0.65"); ss double

0.65

© www.soinside.com 2019 - 2024. All rights reserved.