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);
对于上述情况未给出正确的结果。 给定输入条件,但如果是第二个值的倍数则给出错误的结果
答案 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