在初学C语言中很多人都知道int类型是不会四舍五入的,它只会取整数部分。就例如以下代码:
#include <stdio.h>
int main()
{
int a = 14.99;
printf("%d", a);
return 0;
}
学过C语言的朋友肯定都知道输出的值为14,而不会因为你后面的.99四舍五入打印出15。
但是,你有没有想过对于flaot类型的数在输出是会不会出现四舍五入呢?于是,我带着这个疑问便在我的编译器上进行了实验,结果如下:
此时,看到结果的我很很是疑惑,因为如果计算机四舍五入的话应该输出0.005,0.005,0.004。
如果计算机不会四舍五入的话应该输出0.004,0.004,0.004。而输出这个结果又是什么意思呢?难道计算机是五舍六入的计算?于是我带着这个疑问将数变大一些试试,结果如下:
看到这个结果,我更加的震惊,这次又是个什么情况?怎么一会进行四舍五入,一会又不就行四舍五入。我甚至一度怀疑我的电脑出错。
于是,带着这份疑惑,开启了网上寻答,最后得出了这样一个结果:
原来,计算机是无法准确表示一个数的。计算机只能以一个非常靠近这个的数字来表示这个数字。举个例子来说:printf("%.3f"0.0046)输出的为0.005是四舍五入的结果,而printf("%.3f"0.0045)输出的为0.004其实也是四舍五入的结果,这些在你的编译器尝试一下就明白了,就比如:
可以看到0.0046在计算机中是以0.460000……的形式存储的,四舍五入后就自然的输出0.005.
而0.0045在计算机中则是以0.0044999……的形式存储的,四舍五入后也就自然的输出0.004.
同理可得,0.0044应该输出的为0.004,结果也正如我们所料。
之后我们再来看那两组略大一些的数:
来看第一组那三个数:
3.46在计算机中是以3.46000……的形式存储的,因此四舍五入后应输出3.5.
3.45在计算机中是以3.45000……的形式存储的,因此四舍五入后应输出3.5.
3.44在计算机中是以3.44000……的形式存储的,因此四舍五入后应输出3.4.
之后再来看第二组那三个数:
4.46在计算机中是以4.46000……的形式存储的,因此四舍五入后应输出4.5.
4.46在计算机中是以3.44999……的形式存储的,因此四舍五入后应输出4.4.
4.46在计算机中是以3.44000……的形式存储的,因此四舍五入后应输出4.4.
而结果也正如我们所猜测的那样。
因此我们就可以的出结论:
C语言中float类型输出是四舍五入的!!!
扩展:
有上文可知在计算机中,对于浮点型数据的存储是通过距离这个数字很近的一个数字来表示这个数字,这个数字与你想要表达的数字是有误差的,而这个误差就是浮点数的误差。又因为double类型表示的数据精度更大,因此用定义double类型的变量比float类型的变量要更加精准:
由上图显而易见的看出double类型的变量比float类型的变量要更加精准。
但对于一个浮点型的数据,无论是float类型,还是double类型,其值在计算机中存储都是有些许误差的,因此无法非常精准的表达一个浮点型数据。