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

Tah*_*dia 2 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);
Run Code Online (Sandbox Code Playgroud)

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

孙兴斌*_*孙兴斌 8

说明

使用new BigDecimal(double)可能会失去精确度,请参阅文档:

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

用途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
Run Code Online (Sandbox Code Playgroud)

  • 严格地说,在编译时精度会丢失...当文字转换为IEE浮点值时. (2认同)

Sca*_*bat 5

实例化如

BigDecimal x= new BigDecimal("1.95");
BigDecimal y= new BigDecimal("0.65");
Run Code Online (Sandbox Code Playgroud)

因为并非所有浮点数都可以精确地表示为doubles.

代码中的输出显示 0.65ss0.64999999999999995559107901499373838305473327636718750

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