根据我的理解,使用半偶数舍入,如果您正在舍入的数字在其邻居之间是等距的(例如,如果您在十进制之后的四舍五入,则为4.5),则将前一个数字舍入到最接近的偶数.
例如,如果您在十进制1.5,3.5,5.5,7.5和9.5之后舍入到0位,则将分别向上舍入为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));
}
}
Run Code Online (Sandbox Code Playgroud)
跑:
4.5
BUILD SUCCESSFUL (total time: 0 seconds)
Run Code Online (Sandbox Code Playgroud)
我认为这将会达到4.4
另外,如果我使用4.55输入格式,4.5输出我期望4.6是否有错误的java或我的理解?
我不确定这实际上是技术上的错误.
问题在于,当你编写4.45并且值被解释为a时double,它被舍入为二进制分数:2的幂的倍数之和,达到某种精度.(该舍入本身是使用HALF_EVEN舍入完成的,但使用二进制数字而不是十进制数字.)
该舍入值可能略高于或略低于4.45,但NumberFormat会舍入存储在double中的真实二进制值,而不是您编写的十进制值.
您可以通过编写确定您实际获得的真正二进制值System.out.println(new BigDecimal(4.45)); 当我这样做时,我得到4.45000000000000017763568394002504646778106689453125,这是实际值四舍五入到最接近的0.1 - 这肯定会是4.5.