【问题标题】:How do I correctly round a float Android?如何正确舍入浮动 Android?
【发布时间】:2013-07-08 00:03:43
【问题描述】:

为什么这些测试的行为不同?

public void testRoundFloat() {
    final NumberFormat format = NumberFormat.getNumberInstance();
    format.setMaximumFractionDigits(2);
    format.setMinimumFractionDigits(2);
    format.setRoundingMode(RoundingMode.HALF_UP);
    assertEquals("102,345.56", format.format(102345.556f));
}

public void testRoundDouble() {
    final NumberFormat format = NumberFormat.getNumberInstance();
    format.setMaximumFractionDigits(2);
    format.setMinimumFractionDigits(2);
    format.setRoundingMode(RoundingMode.HALF_UP);
    assertEquals("102,345.56", format.format(102345.556d));
}

第一次四舍五入测试失败,因为格式的结果是 xxx.55,第二次四舍五入测试成功。我正在 Android 4.2.2(17 级)上运行测试

谢谢 马库斯

【问题讨论】:

    标签: android rounding number-formatting


    【解决方案1】:

    Java 的float 是标准的 IEEE 32 位浮点数,只能保持大约 6 位十进制数字的精度。您的第一个测试在将文字 102345.556f 转换为内部形式时由于舍入表示而失败。

    要减少舍入误差,请使用double,或者,对于扩展精度,请使用BigDecimal

    好书:What Every Computer Scientist Should Know About Floating-Point Arithmetic

    【讨论】:

      【解决方案2】:

      roundedNo = ( ((int)(nFloatt *100)) + 5)/100 是最简单的四舍五入到小数点后两位的方法,但浮点数学总是有错误,因为它是以 2 为基数存储和计算并以十进制显示的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-28
        • 2013-07-16
        • 2021-11-21
        • 2012-12-28
        • 1970-01-01
        • 2018-06-29
        相关资源
        最近更新 更多