BigDecimal.ROUND_UP存在问题

nam*_*olk 0 java rounding bigdecimal

为什么我的卖出价是184.84?为什么它在BigDecimal.ROUND_UP中表现得像这样.我查看了BigDecimal.ROUND_HALF_EVEN.它工作正常.但我想知道它为什么会这样.

for(int i = 0; i < 50; i++){
    double  sellrate    = 184.83;
    BigDecimal sellRate = new BigDecimal(sellrate);
    sellRate    = sellRate.setScale(2,BigDecimal.ROUND_UP);
    System.out.println("sellRate : "+sellRate); 
}
Run Code Online (Sandbox Code Playgroud)

Kep*_*pil 5

这就是为什么:

double sellrate = 184.83;
BigDecimal sellRate = new BigDecimal(sellrate);
System.out.println("sellRate: " + sellRate);
Run Code Online (Sandbox Code Playgroud)

版画

sellRate: 184.830000000000012505552149377763271331787109375
Run Code Online (Sandbox Code Playgroud)

这在BigDecimal JavaDoc中解释:

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

使用String构造函数

BigDecimal sellRate = new BigDecimal("184.83");
Run Code Online (Sandbox Code Playgroud)

如果你想得到你的确切价值BigDecimal.