转自:http://blog.renren.com/blog/315991004/876120504

以下语言环境为g++

猜猜看这些代码的输出结果?

printf("%0.1lf\n", 0.05);

printf("%0.1lf\n", 0.25);

printf("%0.1lf\n", 0.75);

printf("%0.2lf\n", 0.025);

printf("%0.2lf\n", 0.015);

printf("%0.2lf\n", 0.125);

有人可能会说了这不是很简单的么。。。四舍五入啊。。。

但是实际上。。。

答案分别是:

0.1

0.2

0.8

0.03

0.01

0.12

C++的输出不是四舍五入,是所谓的“四舍六入五留双”!。

也就是对于5,是看5的前面一位,如果是奇数就进位,偶数就退位。

那为什么第一行会是0.1?

 仔细看一下0.05

printf("%0.20lf\n", 0.05);

输出是0.05000000000000000278

再看看0.015。。。。 

printf("%0.20lf\n", 0.015);

0.01499999999999999944

这是因为电脑是用2进制存数的,而0.05不是纯2进制小数,所以会有误差,而C++的转化方式中是误差是不确定的,从而造成了四舍五入的错觉。

posted on 2012-10-19 18:05  pony1993  阅读(294)  评论(0编辑  收藏  举报

View My Stats