在前不久打代码做题突然思考到一个人问题,怎么去四舍五入?
然后查询了很多资料,但我个人发现一个很有趣的现象。
当想要所得数保留整数时,#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型可以保留的小数位多一位。也不知道是鄙人不行还是那里错了。欢迎讨论,我是萌新,谢谢!