我是靠谱客的博主 合适夕阳,最近开发中收集的这篇文章主要介绍JS 相加精度问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

现象:
就是类似81.6+1.6 相加,结果会变成
83.19999999999999,不等于83.2

整数变成了999999***或者0000000***3

81.6和1.6都是Number类型的。
试了1到100的,有的有此情况有的没有。
在这里插入图片描述
暂时简单的规避解决方法:
四舍五入保留n位小数,处理结果值。

function toDecimal(v,num,isZeroFill) {
    var f = parseFloat(v);
    if (isNaN(f)) {
        return false;
    }
    f = Math.round(v*(Math.pow(10,num)))/Math.pow(10,num);
    var s = f.toString();
    if(isZeroFill !== false){
        var rs = s.indexOf('.');
        if (num>0 && rs < 0) {
            rs = s.length;
            s += '.';
        }
        while (s.length <= rs + num) {
            s += '0';
        }
    }
    return s;
}

查了些类似问题,有些解释的原因:

JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的。浮点数的精度问题不是JavaScript特有的,因为有些小数以二进制表示位数是无穷的。
所以比如 1.1,其程序实际上无法真正的表示 ‘1.1’,而只能做到一定程度上的准确,这是无法避免的精度丢失:1.09999999999999999

十进制二进制
0.10.0001 1001 1001 1001 …
0.20.0011 0011 0011 0011 …
0.30.0100 1100 1100 1100 …
0.40.0110 0110 0110 0110 …
0.50.1
0.60.1001 1001 1001 1001 …

由于计算机是用二进制来存储和处理数字,不能精确表示浮点数,因此这种精度差异几乎出现在所有的编程语言中(例如C/C++/C#,Java),“使用了IEEE 754浮点数格式” 来存储浮点类型(float 32,double 64)的任何编程语言都有此问题,而C#、Java是因为提供了封装类decimal、BigDecimal来进行相应的处理才避开了这个精度差异。
为了避免产生精度差异,把需要计算的数字全升级(乘以10的n次幂)成计算机能够精确识别的整数,等计算完毕再降级(除以10的n次幂),这是大部分编程语言处理精度差异的通用方法。

最后

以上就是合适夕阳为你收集整理的JS 相加精度问题的全部内容,希望文章能够帮你解决JS 相加精度问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部