随笔 - 4  文章 - 13  trackbacks - 0
<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用链接

留言簿(1)

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

先看下如下代码:
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.223.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”的方式。
posted on 2008-11-17 16:50 foxinsky 阅读(2203) 评论(2)  编辑  收藏

FeedBack:
# re: IEEE754标准规定的五种四舍五入方法 2008-11-19 14:29 paul xu
既然这样,那lz何不给出对应的java处理方法  回复  更多评论
  
# re: IEEE754标准规定的五种四舍五入方法 2008-11-19 15:58 foxinsky
@paul xu
方法很简单,在被格式化的数据上加一个很小很小的正数即可
double dTest=82.545d;
DecimalFormat format=new DecimalFormat("0.00");
System.out.println(format.format(dTest+0.00000001));

输出结果就是传统意义上的四舍五入了
  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: