Java 为什么十进制的取整不一致?

Java 为什么十进制的取整不一致?,java,rounding,ieee-754,bankers-rounding,Java,Rounding,Ieee 754,Bankers Rounding,当我将变量n切换为double n=12323233.415时,为什么要将小数部分四舍五入到.44它四舍五入到.42。为什么? 在数字前面的#是否与我有多少个数字有关,因为它似乎仍然打印出整个数字,即使我只有1磅符号 谢谢你的解释 由于浮点精度有限,double值实际上不是您想要的值 事实上,这些值是: import java.text.*; public class TryStuffOut { public static void main(String[] args) {

当我将变量n切换为
double n=12323233.415时,为什么要将小数部分四舍五入到.44它四舍五入到.42。为什么?
在数字前面的#是否与我有多少个数字有关,因为它似乎仍然打印出整个数字,即使我只有1磅符号

谢谢你的解释 由于浮点精度有限,
double
值实际上不是您想要的值

事实上,这些值是:

import java.text.*;

public class TryStuffOut {
    public static void main(String[] args) {
       double n=12323233.445;
       DecimalFormat x = new DecimalFormat("#.##");
       System.out.println(x.format(n));
    }
}
舍入必须与之配合使用,因此它将第一个值向上舍入,第二个值向下舍入

请注意,您的观察是不正确的,而事实恰恰相反。您声称第一个值将向下舍入,而第二个值将向上舍入。但执行它会产生相反的行为。这种行为是由上述原因解释的

浮点数是根据IEE 754实现的,这精确地指定了它们在内部的工作方式


代表 现在,问题是这些数字无法表示。规范说,它应该使用最接近的数字来代替。这正是这里正在发生的事情

您可以在此处进一步检查并使用它:

解释 由于浮点精度有限,
double
值实际上不是您想要的值

事实上,这些值是:

import java.text.*;

public class TryStuffOut {
    public static void main(String[] args) {
       double n=12323233.445;
       DecimalFormat x = new DecimalFormat("#.##");
       System.out.println(x.format(n));
    }
}
舍入必须与之配合使用,因此它将第一个值向上舍入,第二个值向下舍入

请注意,您的观察是不正确的,而事实恰恰相反。您声称第一个值将向下舍入,而第二个值将向上舍入。但执行它会产生相反的行为。这种行为是由上述原因解释的

浮点数是根据IEE 754实现的,这精确地指定了它们在内部的工作方式


代表 现在,问题是这些数字无法表示。规范说,它应该使用最接近的数字来代替。这正是这里正在发生的事情

您可以在此处进一步检查并使用它:


@Tony你不能准确地表示2进制的所有10进制小数。您只能表示大致相同的数字。@Tony您实际使用的不是
12323233.445
,而是
12323233.44500000298
,这是最接近的可表示数字。@Tony只有一些整数可以准确表示。一旦它们变得太大(我认为它大于2^53的双精度),也不是所有的整数都可以表示;浮动y=x+x+x+x+x;y=y+x+x+x+x+x+x;/*10 x 0.1*/System.out.println(y);//=>1.0000001即使是像0.1这样的“简单”数字也不能用二进制精确表示。Like 1/3不能精确地用十进制表示。如果正好在两个数的中间,HALF_甚至更喜欢舍入到最近的偶数numbers@Tony不能精确地表示以2为基数的所有以10为基数的小数。您只能表示大致相同的数字。@Tony您实际使用的不是
12323233.445
,而是
12323233.44500000298
,这是最接近的可表示数字。@Tony只有一些整数可以准确表示。一旦它们变得太大(我认为它大于2^53的双精度),也不是所有的整数都可以表示;浮动y=x+x+x+x+x;y=y+x+x+x+x+x+x;/*10 x 0.1*/System.out.println(y);//=>1.0000001即使是像0.1这样的“简单”数字也不能用二进制精确表示。Like 1/3不能精确地用十进制表示。HALF_甚至更喜欢在两个数字中间取整到最近的偶数。谢谢你的回答,你说这些数字由你所说的其他数字表示,但是当我使用十进制格式时,它不应该仍然取整到.445吗?因为你所说的数字,你的观察是错误的。执行代码会导致完全相反的行为。我已经编辑了答案。嘿,谢谢你的回答,你说这些数字由你所说的其他数字表示,但是当我使用十进制格式时,它不应该还是对.445进行四舍五入吗?因为你所说的数字,你的观察是错误的。执行代码会导致完全相反的行为。我已经编辑了答案。