【问题标题】:DecimalFormat weird behavior with pattern #####0.00 in JavaJava 中模式 #####0.00 的 DecimalFormat 奇怪行为
【发布时间】:2015-07-22 12:23:50
【问题描述】:

我正在使用下面的代码捕捉显示float 带有两位小数的价格值。

NumberFormat FORMAT = new DecimalFormat("#####0.00");
float myFloatValue =\\I am able to fetch this value dynamically
String finalPrice = FORMAT.format(myFloatValue);
// I am using this String (finalPrice) for export xml purpose.

它似乎工作正常,但我注意到一些例子(如下所示)它不能正常工作并产生多于两位小数的价格。我无法再次复制它,我只能在日志文件中看到它。

finalPrice String 的一些示例输出:0.109999660.18000030.45999908

谁能帮我从这些输出中猜出myFloatValue 的原始值?这样它将帮助我复制场景并修复它。

【问题讨论】:

  • 你的例子的输入是什么?
  • 这实际上是我的问题,我直接在日志中获取输出并且无法复制,所以我需要输入我的浮点值。
  • @VishalZanzrukia 我之前的回答是无效的,很抱歉。我无法复制这个问题,但是,如果它有帮助,如果您没有注意到,在您描述的三种情况下,以下四个数字是 0 或 9。是否有任何条件(if/while/for)来格式化数字,否则没有?
  • 对此我唯一想到的是double 原始数据类型中众所周知的精度错误。但是DecimalFormat API 保证只返回模板中指定的位数。您确定日志中的数据来自DecimalFormat.format返回的值吗?
  • 首先,您使用浮点数(双精度也不是解决方案)来模拟价格。 不要将浮点数用于像金钱这样的小数,始终使用大数。 floats 而不是 doubles 甚至更糟,因为如果价格超过 1600 万,您将失去数字。其次,您的 DecimalFormat 似乎还可以,那么您使用的是什么 JDK 版本以及什么机器(Windows、Linux、Mac、Android?)

标签: java floating-point format decimalformat


【解决方案1】:

偶发事件让我想知道 DECIMAL_FORMAT 是否同时在多个线程中使用。这是一个禁忌。然而人们会期望 错误值也是。

也许为了良好的顺序还指定一个固定的语言环境(小数点与逗号,千位分隔符)。

最后float 甚至double 不适合金融软件:这些数字是近似值。

BigDecimal price = new BigDecimal("9.99");
price = price.multiply(BigDecimal.TWO); // 19.98 exact

BigDecimal 是用于编写计算的 PITA,但保持其精度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    相关资源
    最近更新 更多