为了账号安全,请及时绑定邮箱和手机立即绑定

jFormatted 文本字段未正确格式化双数据

jFormatted 文本字段未正确格式化双数据

隔江千里 2023-05-10 13:33:46
我有一个jFormmatedTextField错误地显示双重数据。该字段的格式如下##,##0.00,但是当使用它设置此字段的值时,setValue它有时会显示类似 77.88899888 的内容,但它不应该这样。例如,当我乘以 20.38 x 20 但当我乘以 20.38 x 15 它显示正确的数字时,就会发生此问题。我不明白为什么会这样。代码是这样的:resultField.setValue(new Double(myResultField));
查看完整描述

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。


查看完整回答
反对 回复 2023-05-10
  • 1 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信