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。
添加回答
举报