3

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

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 级)上运行测试

谢谢马库斯

4

2 回答 2

1

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

要减少舍入误差,请使用double或,以提高精度,BigDecimal.

好读物:每个计算机科学家都应该知道的关于浮点运算的知识

于 2013-07-10T07:04:21.013 回答
0

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

于 2013-07-13T03:14:01.473 回答