根据我的理解,半舍入舍入,如果你正在四舍五入的数字在它的邻居之间是等距的(例如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或我的理解是否有错误?
答案 0 :(得分:5)
我不确定这实际上是技术上的错误。
问题在于,当您编写4.45
并且该值被解释为double
时,它将四舍五入为二进制分数:一系列权力的总和2,要精确一些。 (该舍入本身是使用HALF_EVEN舍入完成的,但使用二进制数字而不是十进制数字。)
该舍入值可能略高于或略低于4.45,但NumberFormat
将围绕存储在double中的真实二进制值,而不是您编写的十进制值。
您可以通过撰写System.out.println(new BigDecimal(4.45));
来确定您实际获得的真正二进制值。当我这样做时,我得到4.45000000000000017763568394002504646778106689453125
,这是实际值四舍五入到最接近的0.1 - 这绝对是4.5
。
答案 1 :(得分:1)
它舍入为整数,试试这个
formatter.setMaximumFractionDigits(0);
System.out.println(formatter.format(4.5));
System.out.println(formatter.format(5.5));
输出
4
6