C语言中浮点数不是简单的遵从四舍五入原则

长期以来一直以为C语言中的浮点数保留小数时遵从的是四舍五入原则,网上看到的也是四舍五入

结果今天做了一个小测验,发现居然它遵从的规则似乎不那么简单

 

67bcf3ed1ff74511953deafe8b62e304.png 

如图,我们声明了一个long  double类型的变量iii,并将它赋值为1.345,之后将它放在printf中以保留两位小数的形式打印,然而预期的1.35没有出现反而出现了1.34

之后我们又将5改成了6进行实验,发现此时它遵循四舍六入的原则

812aa1533e1c4319aa2225b8aea0a46f.png

然而我们将变量iii从三位小数改为四位小数后,规律又发生了变化

比如我们将1.345后面添加任意一个非零数字3和6,发现它们的结果都是1.35

9f8cccd274ed42438a5f214774238792.png 

 

 6839279dce4345f8a1f5e298b6062542.png

 而当我们在1.345后面添加0时,结果却又变成了1.34

79641f331d9347738cd0aeac7ffc8b0a.png

然而它并不单纯是舍四六入五成双的原则,因为舍四六入五成双的定义如下:

 

对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,也即“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也要舍去!

 

7e7f1b44abc44385a8ba170145a84580.png

而我们将前面的数字换成7,8之后发现它们无论奇偶都会让后面的5进一位!

11c6aeefb6ac4af0839e8565f971495a.png

 总结在声明并初始化一个三位小数的浮点数后,将它保留两位小数,并对其规则进行探究

发现1.345在5后面为0时输出结果为1.34,遵循四舍六入的原则。而将其改变为1.37或者1.38后却产生了1.35的结果。

而当1.345后面的数字不为0时,输出结果恒为1.35

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值