【问题标题】:DecimalFormat Not Giving Result as per Half_Even RoundingDecimalFormat 不根据 Half_Even 舍入给出结果
【发布时间】:2016-11-21 10:39:31
【问题描述】:

我正在尝试四舍五入到小数点后一位。下面是代码sn-p。

DecimalFormat decimalFormat = new DecimalFormat("#0.#");
String formattedNumber = decimalFormat.format(4.65d);
System.out.println(formattedNumber);

输出
4.7

根据 DecimalFormat javadoc,其默认舍入为 HALF_EVEN。根据这条规则,4.65 应该四舍五入到 4.6。但是,它的输出为 4.7。请帮助我理解这种行为。

【问题讨论】:

  • @ChiragParmar 这不是重复的。另一个问题是关于理解 HALF_EVEN 的基本知识,这不是这个问题的目的。相反,我们正在讨论在上述情况下舍入时显示的意外行为的原因,而您提供的其他问题没有回答。

标签: java decimalformat


【解决方案1】:

对于许多十进制值,双精度值有一个小的表示错误,其中包括 4.65,它实际上比看起来略高。

System.out.println(new BigDecimal(4.65));

打印

4.6500000000000003552713678800500929355621337890625

【讨论】:

  • 感谢您的回复。您能否提供一些阅读材料以更多地了解以一些十进制值表示的这种错误表示。它是 Java 特有的吗?
  • @sky 对于所有 IEEE 754 标准实现来说都是同样的问题。谷歌这方面的链接。除非作为精确表示的值,否则一半甚至没有多大意义。
【解决方案2】:

除了 Peter 的 Lawrey 回答之外,您还可以尝试传递给 decimalFormat.format() 方法 BigDecimal(String val) 以确保传递准确的值:

String formattedNumber = decimalFormat.format(new BigDecimal("4.65"));
System.out.println(formattedNumber);

你会得到4.6的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多