BigDecimal.ROUND_UP存在问题

时间:2013-03-28 14:45:35

标签: java bigdecimal rounding

为什么我的卖出价为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); 
}

2 个答案:

答案 0 :(得分:5)

这就是原因:

double sellrate = 184.83;
BigDecimal sellRate = new BigDecimal(sellrate);
System.out.println("sellRate: " + sellRate);

打印

sellRate: 184.830000000000012505552149377763271331787109375

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");

如果您想获得BigDecimal的确切值。

答案 1 :(得分:1)

BigDecimal(double)构造函数不太可靠,请检查API javadoc。构造BigDecimal的首选方法是使用BigDecimal(String)构造函数。

  

这个构造函数的结果可能有些不可预测。一个   可能会假设在Java中编写新的BigDecimal(0.1)会创建一个   BigDecimal正好等于0.1(未缩放的值为1,带有   比例为1),但它实际上等于   0.1000000000000000055511151231257827021181583404541015625。这是因为0.1不能完全表示为double(或者为此)   重要的是,作为任何有限长度的二进制分数)。因此,价值   传入构造函数的不完全等于   0.1,尽管有外表。