JavaScript百炼成仙自学笔记——15

本文讨论了JavaScript中的小数运算如何导致精度丢失问题,通过使用`.indexOf()`和`.replace()`方法,提供了一种处理小数位数不一致时的补零算法,以确保计算结果的准确性。
摘要由CSDN通过智能技术生成

var num = "0.01";

 var num_arr = num.split(".");

var num_arr2 = num_arr[1];

0.1+0.2=0.3000000000000004

1.001*1000=1000.9999999999999;

小数运算丢失精度问题的解决办法:

前两种都有缺陷(第一种丢失精度,第二种可能出现超出整数上限的值)

.indexOf()   在原来的字符串中搜索一个特定的字符串

.replace()  字符串的替换方法

用第二种方式实现的代码

<script type = "text/javascript">

//1.01+1.001

function add(num1+num2){
    //将数字转换成字符串
    num1=num1.toString();
    num2= num2.toString();

    //获取小数点的位置
    var index1 = num1.indexOf(".");
    var index2 = num2.indexOf(".");

    //如果小数点存在,那么就在获取各自的小数点位数
    var ws1 = 0;
    var ws2 = 0;
    if(index1 != -1){
        ws1 = num1.split(".")[1].length;
    }
    if(index2 != -1){
        ws2 = num2.split(".")[1].length;
    }

    //看看谁的小数数位大,谁的小数数位小
    var bigger = (ws1 > ws2)?ws1:ws2;
    var smaller= (ws1 < ws2)?ws1:ws2;

    //计算得到的需要补齐的0的个数
    var zerosCount = bigger-smaller;

    //好了,现在不管三七二十一,全部去除小数点
    num1 = num1.replace(".","");
    num2 = num2.replace(".","");

    //比较num1和num2谁大,比较的方法就是看谁是smaller,是smaller的一方就补0
    if(ws1 == smaller){
        for(var i =0; i <zerosCount; i++){
            num1 += "0";
        }
    }else{
         for(var i =0; i <zerosCount; i++){
            num2 += "0";
        }
    }


    //开始计算
    var sum = parseInt(num1) +parseInt(num2);
    
    //根据较大的小数位数计算倍数
    var beishu = 1;
    for(var 1=0;i<bigger;i++){
        beishu = beishu*10;
    }
    sum =  sum / beishu;
    return sum;
}
alert(add(1.001,2.002));
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵桑..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值