转自: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++的转化方式中是误差是不确定的,从而造成了四舍五入的错觉。