美文网首页
0.1+0.2!=0.3(浮点数精度丢失问题)

0.1+0.2!=0.3(浮点数精度丢失问题)

作者: 学无止境也 | 来源:发表于2019-10-21 15:59 被阅读0次

浮点数精度丢失问题

在MATLAB中,直接在命令行输入 0.1+0.2==0.3,返回的结果是false(逻辑0),如图

0.1+0.2==0.3

导致这种结果的原因是:在软件的底层世界里,只有01两种二进制编码,而大部分小数以这种二进制编码保存时,是会丢失精度的。所以实际上计算机中保存的0.1已经不是0.1了,同样0.2也不是0.2了,进一步保存的0.1+保存的0.2得到的结果与0.3是有误差的(0.3也不是真正以0.3保存的,也是有误差的。这里由结果可以看出:保存的0.1+保存的0.2≠保存的0.3)。

这里的大部分小数是除1/2, 1/4, 1/8, 1/16, ... 1/2^(n)以及它们的任意组合之外的小数,而1/2, 1/4, 1/8, 1/16, ... 1/2^(n)等是可以精确保存的,即不丢失精度。例如我们可以判断 0.5+0.25==0.75

0.5+0.25==0.75

程序中遇到类似问题的解决办法

最近在写程序,需要判断程序是否在特定条件下终止,就遇到了浮点数精度丢失问题,简而言之,可以用下面概括:

image.png
在经过上面3步操作后(简化为分别给a1, d, a2赋值),我又经过了其他的一些操作。现在我要判断a2-a1<=d是否成立,成立则退出,不成立则继续运行。现在判断:
a2-a1<=d

可以看到,我们预期的结果应该是true(逻辑1),然而程序返回的却是false,有方法解决吗?答案是有的。即换个方式:

a2<=a1+d

你知道其中的原理吗?

关于机器学习、算法、Python、计算机等更多内容,请关注微信公众号:

学无止境也

相关文章

  • 0.1+0.2!=0.3(浮点数精度丢失问题)

    浮点数精度丢失问题 在MATLAB中,直接在命令行输入 0.1+0.2==0.3,返回的结果是false(逻辑0)...

  • js浮点数的比较方法

    正常的比较浮点数大小会出现偏差,因为精度的问题会导致0.1+0.2不等于0.3,所以无法用==或者===做比较,可...

  • JS的计算时精度丢失问题

    精度丢失主要有是哪方面 1.小数计算 如:0.1+0.2 !== 0.3;0.1*0.2 !== 0.03; 2....

  • 2020-04-01(浮点数经度问题)

    解决0.1+0.2 !== 0.3 浮点数经度问题 一.原生方法 使用Number.prototype.toFix...

  • js数字精度丢失问题

    一、JS数字精度丢失的一些典型问题 1. 两个简单的浮点数相加1 0.1 + 0.2 != 0.3// true ...

  • Javascript

    一. 为什么0.1+0.2!=0.3?? 主要是因为:JavaScript在数字运算中的精度确实问题! 在计算...

  • 2019-08-13 测试

    0.1+0.2为什么不等于0.3?如何解决浮点的问题?了解bignumber.js的浮点数库函数 apply(),...

  • Javascript中number类型的二进制表示

    为什么JavaScript中0.1+0.2不等于0.3,如何解决JavaScript中精度缺失的问题 在大多数静态...

  • js浮点数精度计算问题

    前言 项目中,总是不可避免会出现js的浮点数精度计算问题。抛出经典问题:为什么0.1===0.1,0.1+0.2!...

  • 0.1+0.2 == 0.3正确吗?

    不正确。0.1+0.2 不等于0.3 而是等于0.30000000000000004。因为java浮点数运算会存在...

网友评论

      本文标题:0.1+0.2!=0.3(浮点数精度丢失问题)

      本文链接:https://www.haomeiwen.com/subject/pemtvctx.html