由於這是之前提到的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