为什么我的卖出价为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);
}
答案 0 :(得分:5)
这就是原因:
double sellrate = 184.83;
BigDecimal sellRate = new BigDecimal(sellrate);
System.out.println("sellRate: " + sellRate);
打印
sellRate: 184.830000000000012505552149377763271331787109375
中对此进行了解释
此构造函数的结果可能有些不可预测。有人可能会认为在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,尽管有外表。