先看下如下Java代码:
double dTest=82.545d;
DecimalFormat format=new DecimalFormat("0.00");
System.out.println(format.format(dTest));
你觉得会输出什么?82.55?还是82.54?
再试下这段代码:
double dTest=82.535d;
DecimalFormat format=new DecimalFormat("0.00");
System.out.println(format.format(dTest));
你觉得会输出什么?82.53?还是82.54?
先别猜,自己运行下……
或者有人认为这是DecimalFormat的一个BUG?
不是的,这其实是IEEE754标准规定的一种“to even”的四舍五入的方法,即:
该方法在省略数据只有一个 5 的情况下,需要看前面一位。若为偶数则省略,若为奇数则进位,也就是偶数优先。
IEEE754规定了如下的几种四舍五入的标准,分别举例说明其意义:
我们常规意义上的“四舍五入”是“away from zero”的方式。
double dTest=82.545d;
DecimalFormat format=new DecimalFormat("0.00");
System.out.println(format.format(dTest));
你觉得会输出什么?82.55?还是82.54?
再试下这段代码:
double dTest=82.535d;
DecimalFormat format=new DecimalFormat("0.00");
System.out.println(format.format(dTest));
你觉得会输出什么?82.53?还是82.54?
先别猜,自己运行下……
或者有人认为这是DecimalFormat的一个BUG?
不是的,这其实是IEEE754标准规定的一种“to even”的四舍五入的方法,即:
该方法在省略数据只有一个 5 的情况下,需要看前面一位。若为偶数则省略,若为奇数则进位,也就是偶数优先。
IEEE754规定了如下的几种四舍五入的标准,分别举例说明其意义:
“away from zero” 例:3.215 -> 3.22,-3.215 -> -3.22
“towards zero” 例:3.215 -> 3.21,-3.215 -> -3.21
“to even” 例:3.215 -> 3.22,3.245 -> 3.24
“towards positive infinity” 例:3.215 -> 3.22,-3.215 -> -3.21
“towards negative infinity” 例:3.215 -> 3.21,-3.215 -> -3.22
我们常规意义上的“四舍五入”是“away from zero”的方式。