gpt4 book ai didi

java - 为什么这个数字向下舍入?

转载 作者:行者123 更新时间:2023-11-30 09:09:33 26 4
gpt4 key购买 nike

我对 Java 的 NumberFormat 的行为感到困惑。

考虑以下将 double 值转换为其百分比表示并将结果百分比四舍五入到小数点后三位的方法:

public static String doubleToPercent(final double val) {
NumberFormat nf = NumberFormat.getPercentInstance();
// Default rounding mode is HALF_EVEN
nf.setRoundingMode(RoundingMode.HALF_UP);
nf.setMaximumFractionDigits(3);
return nf.format(val);
}

舍入模式为HALF_UP

worksAsExpected 的结果并不让我吃惊;测试通过:

@Test
public void worksAsExpected() {
double input = 1.234585;
String expected = "123.459%";
String output = doubleToPercent(input);
assertEquals(expected, output);
}

但是这个呢:

@Test
public void surprise() {
double input = 1.234535;
String expected = "123.454%";
String output = doubleToPercent(input);
assertEquals(expected, output);
}

为什么这个测试失败了?为什么 1.234535 向下舍入而 1.234585 向上舍入?

另一方面,如果最后一位数字是 6,则该数字会向上舍入。

@Test
public void noSurprise() {
double input = 1.234536;
String expected = "123.454%";
String output = doubleToPercent(input);
assertEquals(expected, output);
}

这与 double 的精度限制有关吗?我猜 1.234535 这样的数字完全在 double 的能力范围内。

我使用的是运行 Windows 7 x86 的 Java 1.7.0_51。

欢迎任何见解。

最佳答案

1.234535 = 1.2345349999999999379696191681432537734508514404296875 作为 double ,因此对于 6 位数字向下舍入为 1.23453。

您可以使用我的十进制/二进制转换器 exploringbinary.com/binary-converter看看会发生什么。

注意:与普通二进制数不同,二进制小数的精确十进制表示总是具有相同的位数:

0.001 =
0.125,

0.1101101 =
0.8515625,

0.00001110101011 =
0.05731201171875,

1.0011110000001010011111000101101011000100011100011011 =
1.2345349999999999379696191681432537734508514404296875

etc.

如果您需要更多地控制小数位和舍入,则必须使用 BigDecimal .请注意,最好为您对数字执行的每个操作计算舍入误差。 See this question for details .

关于java - 为什么这个数字向下舍入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23008862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com