7

我正在考虑使用 BigDecimal 来比较两个四舍五入为 2 位的货币值。例如,我希望以下结果为 0,因为我将应该舍入为 0.02 的值与 0.02 的值进行比较。但它产生 -1 !! 有正确的方法吗?

这也应该适用于更大的数字,比如 123.45 vs 123.4534 ...当使用“compareTo”时应该产生 0。

我试过使用数学上下文,但它看起来并不优雅......有正确的方法吗?

BigDecimal spread = new BigDecimal(0.01934);
spread.setScale(2, RoundingMode.HALF_EVEN);
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(new BigDecimal(0.02)));

解决方案是:

BigDecimal spread = new BigDecimal(0.01934).setScale(2, RoundingMode.HALF_EVEN);
BigDecimal loSpread = new BigDecimal(0.02).setScale(2, RoundingMode.HALF_EVEN);
System.out.format("0.0193 ? 0.02 = %d\n", spread.compareTo(loSpread));
4

2 回答 2

10

首先,BigDecimal 是不可变的。您必须从 setScale 方法调用返回结果:

spread = spread.setScale(2, RoundingMode.HALF_EVEN);

接下来,您必须提高第二个 BigDecimal 的准确性,因为它是从双精度派生的——不是一个非常准确的实体。所以尝试一个字符串:

 spread.compareTo(new BigDecimal("0.02"))
于 2012-06-24T02:04:27.450 回答
5

0.02 被评估为

java.math.BigDecimal = 0.0200000000000000004163336342344337026588618755340576171875

你也必须在那里设置Scale(2, RoundingMode.HALF_EVEN)。

于 2012-06-24T02:13:05.767 回答