长期以来一直以为C语言中的浮点数保留小数时遵从的是四舍五入原则,网上看到的也是四舍五入
结果今天做了一个小测验,发现居然它遵从的规则似乎不那么简单
如图,我们声明了一个long double类型的变量iii,并将它赋值为1.345,之后将它放在printf中以保留两位小数的形式打印,然而预期的1.35没有出现反而出现了1.34
之后我们又将5改成了6进行实验,发现此时它遵循四舍六入的原则
然而我们将变量iii从三位小数改为四位小数后,规律又发生了变化
比如我们将1.345后面添加任意一个非零数字3和6,发现它们的结果都是1.35
而当我们在1.345后面添加0时,结果却又变成了1.34
然而它并不单纯是舍四六入五成双的原则,因为舍四六入五成双的定义如下:
对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,也即“4舍6入5凑偶”,这里“四”是指≤4 时舍去,"六"是指≥6时进上,"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:
(1)5前为奇数,舍5入1;
(2)5前为偶数,舍5不进(0是偶数)。
我们在仍然用1.345五成双这个例子进行实验,将4修改为5,6,7等数字以此进行检验
发现不管是5还是6它们最后的输出结果是1.35和1.36!即便5的前面的是6后面的5也要舍去!
而我们将前面的数字换成7,8之后发现它们无论奇偶都会让后面的5进一位!
总结在声明并初始化一个三位小数的浮点数后,将它保留两位小数,并对其规则进行探究
发现1.345在5后面为0时输出结果为1.34,遵循四舍六入的原则。而将其改变为1.37或者1.38后却产生了1.35的结果。
而当1.345后面的数字不为0时,输出结果恒为1.35