2012-06-24 45 views
7

我正在考虑使用BigDecimal比较两个舍入为2位数的货币值。例如,我期望下面的结果为0,因为我将0.02到0.02的东西进行比较。但它产量-1!有没有正确的方法来做到这一点?Java中的BigDecimal

这应该也适用于更大的数字,如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)); 

回答

5

0.02被评估为

java.math.BigDecimal = 0.0200000000000000004163336342344337026588618755340576171875 

你必须setScale(2 RoundingMode.HALF_EVEN)也有。

+0

这是另一种获得精确浮点数的方法。 1+。 –

+0

必须在这里使用这两个想法才能做对。将张贴正确的代码。 – fodon

10

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

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

接下来你必须改进第二BigDecimal的精确度,因为它从一个双衍生 - 没有一个非常准确的实体。因此,尝试一个字符串:

spread.compareTo(new BigDecimal("0.02")) 
+0

这实际上是用来比较价格。他们可能不得不从双打实例化。 – fodon

+0

@fodon:然后用户未知有你的答案的一部分,我有另一部分(关于BigDecimal是不可变的)。 –

+1

我恢复了无效编辑。如果您对所看到的答案不满意,请提供_注释_或提供附加答案。 –