【问题标题】:Format fractional percent in java yields very strange behaviour在java中格式化小数百分比会产生非常奇怪的行为
【发布时间】:2012-02-13 16:58:52
【问题描述】:

我正在尝试使用以下代码格式化百分比:

NumberFormat fmt = NumberFormat.getPercentInstance();
fmt.setRoundingMode(RoundingMode.HALF_UP);
fmt.setMinimumFractionDigits(0);
fmt.setMaximumFractionDigits(0);
System.out.println(fmt.format(0.145));

但是,我得到了一个非常奇怪的结果:

14%

将值 0.145 更改为其他值,例如 0.125 将正常工作,结果将符合预期

13%

有人可以解释一下吗?提前致谢

【问题讨论】:

    标签: java number-formatting


    【解决方案1】:

    这是由于double 中固有的舍入误差,导致0.145 被舍入到

    0.1449999999999999900079927783735911361873149871826171875
    

    如果您希望准确无误,请使用 BigDecimal

    【讨论】:

    • 出于好奇,为什么 0.125 不一样?
    • 因为 0.125 可以精确地表示为二进制小数,因为它等于 1/8
    【解决方案2】:

    我认为这是浮动的实习生表示的结果。 (用二进制数表示的十进制数)。

    您的 0.145 可能在内部表示为 0.144999999999...,因此舍入模式向下舍入。

    【讨论】:

      【解决方案3】:

      您应该阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic,但基本上归结为 .145 不能以 IEEE 浮点数精确表示,因此被四舍五入到可以表示的最接近的值,恰好是略小于 0.145,因此当四舍五入为两位数时会向下舍入。

      【讨论】:

        猜你喜欢
        • 2014-07-17
        • 2021-12-18
        • 2019-12-28
        • 2013-01-20
        • 1970-01-01
        • 2013-01-05
        • 1970-01-01
        • 2015-04-13
        • 2013-10-25
        相关资源
        最近更新 更多