C语言四舍五入之有趣的现象

在前不久打代码做题突然思考到一个人问题,怎么去四舍五入?

然后查询了很多资料,但我个人发现一个很有趣的现象。

  当想要所得数保留整数时,#include<stdio.h>
这样就可以使得输入浮点型并输出保留整数的值了,但果是要保留N位小数呢?我当时思考过这个问题。于是我便进行了如下的操作并得出结论:

(1)

  这种方法可以保留一位小数,但很奇怪,再输入1.55的时候,输出值就为1.5,但输入1.56时,结果却为1.6四舍五入了,后面随着输入的值次数增多且输入的数不同来进行比较。发现有些数会进行四舍五入,有些数却不能。这究竟是为什么呢?

  (2)于是我不信邪了

这次保留两位小数,发现当输入1.555时输出结果又为1.55,也就是说依然会有误差存在,但输入别的数比如1.556时却四舍五入成功,这又是为什么?后面经过朋友测试,输入的值(比如是保留一位小数的1.55时,在输出前加一个测试,测试的结果a为1.549999)会产生意想不到的误差,众所周知,float浮点型的有效值为6位,可为什么第二位就产生了误差呢?

  随着保留的数越来越多,一些数可以四舍五入、一些数不可以四舍五入的现象越来越明显,这是为什么呢?为什么会存在离有效数字范围隔了这么远还能有误差的存在?这我到现在都不知道。。。

  但神奇的现象来了 

当我换成浮点型时,输入1.5可以化为2.与float类型不同的是,这次输入1.55可以转换为1.56,但奇怪的事情发生了,当保留两位小数时输入1.555依旧如上面的情况一样输出1.55,经过测试输入的值为1.5549(后面全是9),难道就只能用其他方法进行四舍五入吗?

  总结:后面来来回回也实验过不少次,发现在double的时候,有些时候会无任何误差百分之百进行四舍五入转换,但有些时候会如以上情况一样,就比float型可以保留的小数位多一位。也不知道是鄙人不行还是那里错了。欢迎讨论,我是萌新,谢谢!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值