我也建議你使用除BigDecimal以外的所有可能涉及貨幣的算術。
確保您始終使用BigDecimal的String構造函數。爲什麼?試試下面的代碼在JUnit測試:
assertEquals(new BigDecimal("0.01").toString(), new BigDecimal(0.01).toString());
會得到以下的輸出:
expected:<0.01[]> but was <0.01[000000000000000020816681711721685132943093776702880859375]>
事實是,你不能存儲EXACTLY 0.01作爲「雙」量。只有BigDecimal根據需要存儲您需要的數字正確。
並記住BigDecimal是不可變的。下面將編譯:
BigDecimal amount = new BigDecimal("123.45");
BigDecimal more = new BigDecimal("12.34");
amount.add(more);
System.out.println("Amount is now: " + amount);
但產生的結果應該是:現在
金額爲:123.45
那是因爲你需要將結果分配到一個新的(或相同)BigDecimal變量。
換句話說:
amount = amount.add(more)
除非你喜歡有錢消失,否則不要在浮動/雙打中存儲貨幣值。 –
由於我只能接受一個答案,非常感謝你們所有人。 – lostinmoney