1 回答

TA貢獻1844條經驗 獲得超8個贊
一般對于算術精度運算,盡量使用BigDecimal而不是Double字段。這負責將數據四舍五入到您需要的精度。您可以使用以下代碼親自查看:
Double a = 20.38
Double b = 20
println(a * b)
BigDecimal c = 20.38
BigDecimal d = 20
println(c * d)
但是,如果您不能更改變量的類型,則可以使用十進制格式將輸出格式化為您想要的格式
String pattern = "##,##0.00";
DecimalFormat decimalFormat = new DecimalFormat(pattern);
println(decimalFormat.format(c * d))
println(decimalFormat.format(a * b))
至于為什么雙打會這樣,歸根結底是數字在內部表示的方式。有一些很好的博客介紹如何浮動/加倍松散數字精度(float precision loss)。長話短說,由于它在內存中表示的方式浮動/加倍松散精度,但 BigDecimal 表示不會遭受這種損失。以下是一些包含更多信息的鏈接。
https://www.soa.org/news-and-publications/newsletters/compact/2014/may/com-2014-iss51/losing-my-precision-tips-for-handling-tricky-floating-point-arithmetic/ .
https://en.wikipedia.org/wiki/Loss_of_significance。
添加回答
舉報