使用BigDecimal进行奇怪的舍入行为?

dmi*_*ril -1 java rounding bigdecimal

什么会打印到控制台,为什么?

1.

BigDecimal BigDecimalNum = new BigDecimal("0.0774");
System.out.println(BigDecimalNum.doubleValue() * 100.00);
Run Code Online (Sandbox Code Playgroud)

2.

BigDecimal BigDecimalNum2 = new BigDecimal("0.0774");   
System.out.println(BigDecimalNum2.multiply(new BigDecimal("100.00")));
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

我的机器上的结果是:

7.739999999999999
7.740000
Run Code Online (Sandbox Code Playgroud)

这根本不会让我感到惊讶.在第二种情况下,我们完全处理BigDecimal,并且总是成倍增加 - 没有理由出错.

在第一种情况下,您将BigDecimal转换为double,因此您的代码是有效的

double d = 0.0774;
System.out.println(d * 100.0);
Run Code Online (Sandbox Code Playgroud)

值0.0774不能精确表示为a double,因此存在差异.

这与此无关BigDecimal,而且与此无关double.你应该几乎从来没有被之间的转换BigDecimaldouble那种哪些适合使用的值-尽管BigDecimal几乎都是不合适的代表作为double值.