亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 0.4 和 0.40 與 BigDecimal 不同?

為什么 0.4 和 0.40 與 BigDecimal 不同?

慕斯王 2023-02-23 09:56:53
我讀過 BigDecimal 是用 Java 表示金錢的方法。但我不明白為什么我的一個單元測試失敗并顯示以下消息:org.opentest4j.AssertionFailedError:    Expected :0.40  Actual   :0.4“實際”值是 的結果BigDecimal.valueOf(0.398).setScale(2, RoundingMode.HALF_UP)。所以我想我的問題有兩個部分:為什么不將這些值視為相等?我怎樣才能以不會觸發這種不匹配的方式將 0.40 美元表示為 BigDecimal?
查看完整描述

1 回答

?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

BigDecimals 是數字和“比例”的組合。2 BD 不認為自己相等,除非兩者相等。我建議使用.compareTo(other) == 0)來獲得答案。

NB:我不認為使用 BD 是做貨幣的好方法。

通常有兩種處理貨幣的方法。簡單的方法和困難的方法。

簡單的方法是將美分存儲在intor中long。因此,將 $0.40 簡單地存儲為40,而 $12.50 之類的東西將存儲為1250。你現在有 2 個問題:你不能代表半美分,并且可能會發生溢出(你不能代表高于 2^31-1 美分的金額,但那是......很多美分。讓它成為long我們遠遠超過整個世界的 GDP)。

但是,半美分通常是一個問題。拿這個問題來說:

我有 4 美分。我想把這些分給 3 個人。

那么我們該怎么辦?BigDecimal 在這里幫不了你;你不能用 BD 完美地表示 4 除以 3。你必須在某個地方四舍五入(它是 1.33333333 ...... BD 不能代表無限序列)。即使它可以或者您決定以某個驚人的數量(比如說 200 位)四舍五入,現在又如何呢?你不能告訴你的銀行轉賬三分之一美分。沒有簡單的答案:如果這是您的應用程序需要做的,那么您需要決定如何處理它。例如,“剩余的一分錢用于房屋”或“軟件隨機選擇一個收件人;他們得到 2 美分,另外 2 個得到 1 美分)。

換句話說,如果“只使用一個 int/long”不這樣做,那么 BigDecimal 很可能也不好。


查看完整回答
反對 回復 2023-02-23
  • 1 回答
  • 0 關注
  • 102 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號