温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

浮点数精度丢失问题

发布时间:2020-09-24 20:22:10 来源:网络 阅读:1100 作者:guxianyang 栏目:开发技术


一. 浮点数精度丢失的原因

1. 计算机的二进制实现和位数限制有些数无法表示。就像一些无理数不能有限表示,如:圆周率3.1415926...,1.333...等。JS遵循 IEEE 754 规范,采用双精度存储(double precision),占用64bit。如图:

s
eeeeeee  eeee
ffff  ffffffff  ffffffff  ffffffff  ffffffff  ffffffff
1
11
52

说明:

  • 1位用来表示符号位

  • 11位用来表示指数

  • 52位表示尾数

JS中能精准表示的最大整数是Math.pow(2, 53),十进制 9007199254740992,大于 9007199254740992 就可能丢失精度。

详细了解可以看这篇论文:What Every Computer Scientist Should Know About Floating-Point Arithmetic


二. 浮点数的加减乘除

1. 两个浮点数相乘

alert("1024.2 * 1.2 = " + (1024.2 * 0.2));

三. 解决方案

1. 先把浮点数放大倍数到整数,再进行运算,最后将结果缩小倍数。

2. 案例1:解决两个浮点数相乘丢失精度问题

// 解决两个浮点数相乘丢失精度问题
// a: 第一个参数
// b: 第二个参数 
function sum(a, b){
    var weight = 0;
    var aStr = a.toString();
    var bStr = b.toString();
    var regex = /^\d+$/;
    
    if(!regex.test(aStr)){
        weight += aStr.split(".")[1].length; 
        aStr = aStr.replace(".","");
    }
    if(!regex.test(bStr)){
        weight += bStr.split(".")[1].length;
        bStr = bStr.replace(".","");
    }
    return Number(aStr) * Number(bStr) / Math.pow(10, weight);
}

四. 知识点

1.Math.floor()方法执行的是向下取整计算,它返回的是小于或等于函数参数,并且与之最接近的整数。

<script type="text/javascript">

document.write(Math.floor(0.60) + "<br />")
document.write(Math.floor(0.40) + "<br />")
document.write(Math.floor(5) + "<br />")
document.write(Math.floor(5.1) + "<br />")
document.write(Math.floor(-5.1) + "<br />")
document.write(Math.floor(-5.9))

</script>

输出:

0
0
5
5
-6
-6

五. 学习博文

1. http://www.cnblogs.com/snandy/p/4943138.html

2. http://blog.csdn.net/dclove/article/details/43112839


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI