为什么这些测试表现不同?
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级)上运行测试
由于 马库斯
答案 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中存储和计算并以十进制显示。