由于这是之前提到的BigDecimal
好选项,如果你需要更好的双精度的精度。
有很好的方法做与BigDecimal
s舍入。基本上你必须指定BigDecimal
实例。看看此示例代码:
BigDecimal decimalOne = new BigDecimal(0.1950);
BigDecimal decimalTwo = decimalOne.setScale(2, BigDecimal.ROUND_HALF_DOWN);
BigDecimal decimalThree = decimalOne.setScale(4, BigDecimal.ROUND_HALF_DOWN);
System.out.println("decimalOne: " + decimalOne);
System.out.println("decimalTwo: " + decimalTwo);
System.out.println("decimalThree: " + decimalThree);
的Java 7将打印这样的事情:
decimalOne: 0.195000000000000006661338147750939242541790008544921875
decimalTwo: 0.20
decimalThree: 0.1950
请注意,BigDecimal
实例是不可变的,这就是为什么你必须的setScale
分配结果新实例(decimalOne
不会更改)。
在许多金融体系double
s的不用于存储货币信息;代替使用具有特定精度的long
类型。对于精度2,值100
将是1.00
,122
将是1.22
等。该方法简化并计算了计算结果,但对所有系统都不好。然而,为了简化这个问题,我不会深入探讨这个问题。
来源
2013-01-12 11:56:01
Tom
如果这是出于货币目的,请改用'BigDecimal'。 – Swapnil
请参阅[这里](http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency)为什么使用货币双重不是一个好主意。 – Jonathan
'n/12'是一个整数运算,所以对于'n = 1',它将为零,而不是'1/12'。否则,'double'永远不会100%精确。你可以使用'DecimalFormat'来表示你的数字。 – jlordo