我如何正确地围绕浮动Android?

时间:2013-07-10 06:53:50

标签: android rounding number-formatting

为什么这些测试表现不同?

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,第二次测试舍入一个double成功。我在Android 4.2.2(17级)上运行测试

由于 马库斯

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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