0

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

2 回答 2

5

这就是为什么:

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

印刷

sellRate: 184.830000000000012505552149377763271331787109375

BigDecimal JavaDoc对此进行了解释:

此构造函数的结果可能有些不可预测。有人可能会假设用 Java 编写 new BigDecimal(0.1) 会创建一个正好等于 0.1 的 BigDecimal(未缩放的值 1,缩放为 1),但它实际上等于 0.1000000000000000055511151231257827021181583404541015625。这是因为 0.1 不能完全表示为双精度数(或者,就此而言,不能表示为任何有限长度的二进制分数)。因此,传递给构造函数的值并不完全等于 0.1,尽管看起来如此。

使用String构造函数

BigDecimal sellRate = new BigDecimal("184.83");

如果您想获得BigDecimal.

于 2013-03-28T14:48:43.597 回答
1

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

此构造函数的结果可能有些不可预测。有人可能会假设用 Java 编写 new BigDecimal(0.1) 会创建一个正好等于 0.1 的 BigDecimal(未缩放的值 1,缩放为 1),但它实际上等于 0.10000000000000000555511151231257827021181583404541015625。这是因为 0.1 不能完全表示为双精度数(或者,就此而言,不能表示为任何有限长度的二进制分数)。因此,传递给构造函数的值并不完全等于 0.1,尽管看起来如此。

于 2013-03-28T14:49:51.650 回答