0
点赞
收藏
分享

微信扫一扫

0.1+0.2=0.3不对.我快被这个问题折腾吐血了(浮点误差)

探头的新芽 2022-04-18 阅读 40
microsoft

参考链接: https://gewuweb.com/office365/2445.html

**我的目标:**让中国的大学生走出校门的那一刻就已经具备这些Office技能,让职场人士能高效使用Office为其服务。支持鹏哥,也为自己加油!

有时候,我们总会遇到一些莫名其妙的问题,被折腾的精疲力尽,唉,简直比结婚那天都累……

比如下面这个:

大家都知道,当Vlookup第四位参数为0时,是精确匹配,我们看看,当A1中直接输入0.3,根据D3就能成功匹配到1,可是当我们在A1里输入0.1+0.2时,发现E2中匹配不到正确的结果了?

难道0.1+0.2不等于0.3?不会引发世界之争吧!

世界之大,真是无奇不有!做个表格搞得跟研究哥德巴赫猜想一样复杂!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OX7LevjF-1650256203952)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]

想要真正搞懂为啥在Excel中输入0.1+0.2,结果看似0.3,实则其结果和0.3有微乎其微的一小点误差的原因?首先要搞懂计算机中是怎么存储数据的。

别想的那么复杂,认真读下去,你会明白的。

大家都知道,我们通常用的计算机在存储数据时是以二进制的方式存储,而我们工作中通常用的是十进制的数据,所以我们把十进制的数据输入计算机以后,计算机会把其转换为二进制,然后再行处理。

具体怎么转换的?

十进制的整数转化二进制采用“除2取余,逆序排列”法。

看下面的例子:

把十进制的15转化为二进制表达:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wqXgiE5Q-1650256203953)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]

连续除以2取余数,直到商为0,然后把余数倒叙排列,所以十进制的15转化为二进制就是1111,如上图。

Excel里的函数DEC2BIN可以将十进制的整数转换为二进制,大家可以自己试试。

把十进制的小数转换为二进制数字采用的是“乘2取整,顺序排列”法。

看下面的例子:

把十进制的0.75转化为二进制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sszc2oyO-1650256203954)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]

0.75乘以2取整,剩下的部分乘以2再取整,直到剩下的部分为0,所以0.75转化为二进制就是0.11。

理解了上面的原理以后,我们尝试着将小数0.2转化为二进制的数字:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JJKO6KrO-1650256203954)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]

我的天哪!居然发现陷入了一个死循环,0.0011001100110011……

这下计算机该怎么存储呢?总不能也跟着无限循环下去吧,那不要爆了吗?所以就有了浮点数。

就像我们平常在Excel里输入一个比较大的数字时系统会自动用科学计数法计数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qnnbu4Ux-1650256203956)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]

我们总要想办法存储这种小数位数无限多的数字吧,所以用浮点数来近似来的表达某个实数。

由于这个实数是由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,相对定点数来说,它的小数点的位置不确定,所以叫浮点。

所以浮点数只是个近似的值,当它参与运算的时候就定会产生浮点误差。

那怎么解决这种误差呢?

方法1:可以用Round函数强制性四舍五入,如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xdSbkf7G-1650256203956)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]

方法2:四舍六入五成双

原则:需要保留数字的后一位数字小于4时舍去,大于6进位,等于5时分两种情况,如果5后面是非零数值,那么进位,如果5后面是0,那么又分两种情况,保留数字为偶数就舍去,为奇数就进位。

看点实际的例子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-22Wmi320-1650256203957)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]

用公式如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d3PNIvtO-1650256203958)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]

=ROUND(A2,2)-(MOD(A2*103,20)=5)*10(-2)

**方法 3:**以显示精度为准(从微软支持摘抄过来的)

在某些情况下,您可以使用“以显示精度为准”选项来防止四舍五入错误影响您的工作。此选项会强制将工作表中每个数字的值成为显示的值。要打开此选项,请按照下列步骤操作:

  1. 在 Excel 2003 和更早的版本中,在“工具”菜单上单击“选项”。

  2. 在“重新计算”选项卡上,单击“以显示精度为准”复选框以将其选中。

  3. 在 Excel 2007 中,单击“Office 按钮”,单击“Excel 选项”,然后单击“高级”类别。

  4. 在“计算此工作簿时”部分中,选择所需的工作簿,然后选中“将精度设为所显示的精度”复选框。

例如,如果选择显示两位小数的数字格式,然后打开“以显示精度为准”选项,则在您保存工作簿时,所有超出两位小数的精度均将会丢失。此选项影响活动的工作簿(包括所有工作表)。您无法撤消此选项和恢复丢失的数据。建议您在启用此选项之前保存工作簿。

通常用Round就可以解决,但是要求比较高的话可以考虑用第二种,第三种类似第一种,但是不可撤销,较少用。

本节的分享就到这里,鹏哥祝大家每天都有进步。

加入米宏Office培训群,每天进步一点点!

从基础操作到VBA,

两杯咖啡的钱,

换取一份如此详细的Excel视频资料,

你还在犹豫?

每天进步一点,每天提升一点!
参考来源: https://gewuweb.com/sitemap.html

举报

相关推荐

0 条评论