半偶数舍入
Half-Even Rounding
根据我的理解,如果您四舍五入的数字与其相邻数字之间的距离相等(例如,如果您在小数点后一位四舍五入,则为 4.5),则将前面的数字四舍五入到最近的偶数。
例如,如果您四舍五入到小数点后的 0 位
1.5、3.5、5.5、7.5 和 9.5 将分别向上取整为 2、4、6、8 和 10。这一切在 netbeans 中都运行良好,但是当我四舍五入到小数点后 1 位时,我 运行 遇到了问题。
package foo;
import java.text.NumberFormat;
public class Foo {
public static void main(String[] args) {
NumberFormat formatter = NumberFormat.getNumberInstance();
formatter.setMaximumFractionDigits(1);
System.out.print(formatter.format(4.45));
}
}
运行:
4.5
BUILD SUCCESSFUL (total time: 0 seconds)
我认为这会四舍五入到 4.4
此外,如果我使用 4.55 输入到格式中,则输出 4.5,而我期望的是 4.6
java 还是我的理解有误?
我不确定这实际上是技术上的错误。
问题在于,当您编写 4.45
并且该值被解释为 double
,即四舍五入为 二进制 分数:总和2 的幂的倍数,达到一定的精度。 (四舍五入本身是用 HALF_EVEN 舍入完成的,但是用二进制数字而不是十进制数字。)
该舍入值可能略高于或略低于 4.45,但 NumberFormat
将舍入存储在 double 中的真实二进制值,而不是您写入的十进制值。
您可以通过编写 System.out.println(new BigDecimal(4.45));
来确定您实际获得的真实二进制值 当我这样做时,我得到 4.45000000000000017763568394002504646778106689453125
,这是四舍五入到最接近的 0.1 的实际值 --这肯定会是 4.5
.
四舍五入为整数,试试这个
formatter.setMaximumFractionDigits(0);
System.out.println(formatter.format(4.5));
System.out.println(formatter.format(5.5));
输出
4
6
根据我的理解,如果您四舍五入的数字与其相邻数字之间的距离相等(例如,如果您在小数点后一位四舍五入,则为 4.5),则将前面的数字四舍五入到最近的偶数。
例如,如果您四舍五入到小数点后的 0 位 1.5、3.5、5.5、7.5 和 9.5 将分别向上取整为 2、4、6、8 和 10。这一切在 netbeans 中都运行良好,但是当我四舍五入到小数点后 1 位时,我 运行 遇到了问题。
package foo;
import java.text.NumberFormat;
public class Foo {
public static void main(String[] args) {
NumberFormat formatter = NumberFormat.getNumberInstance();
formatter.setMaximumFractionDigits(1);
System.out.print(formatter.format(4.45));
}
}
运行:
4.5
BUILD SUCCESSFUL (total time: 0 seconds)
我认为这会四舍五入到 4.4
此外,如果我使用 4.55 输入到格式中,则输出 4.5,而我期望的是 4.6 java 还是我的理解有误?
我不确定这实际上是技术上的错误。
问题在于,当您编写 4.45
并且该值被解释为 double
,即四舍五入为 二进制 分数:总和2 的幂的倍数,达到一定的精度。 (四舍五入本身是用 HALF_EVEN 舍入完成的,但是用二进制数字而不是十进制数字。)
该舍入值可能略高于或略低于 4.45,但 NumberFormat
将舍入存储在 double 中的真实二进制值,而不是您写入的十进制值。
您可以通过编写 System.out.println(new BigDecimal(4.45));
来确定您实际获得的真实二进制值 当我这样做时,我得到 4.45000000000000017763568394002504646778106689453125
,这是四舍五入到最接近的 0.1 的实际值 --这肯定会是 4.5
.
四舍五入为整数,试试这个
formatter.setMaximumFractionDigits(0);
System.out.println(formatter.format(4.5));
System.out.println(formatter.format(5.5));
输出
4
6