• js 浮点小数计算精度问题 parseFloat 精度问题


    在js中进行以元为单位进行金额计算时 使用parseFloat会产生精度问题
    var price = 10.99;
    var quantity = 7;
    var needPay = parseFloat(price * quantity);

    needPay的正确结果应该是76.93元  但是运行后发现needPay为76.93000000000001 
    此情况可通过 toFixed(n)  方法修正 但是这个方法对 js版本要求较高 不能兼容ie5

    另一个解决方案是: 将元为单位的金额乘以100换算为分进行计算

    var price = 10.99
    var quantity = 7
    var needPay = Math.floor(parseFloat(price*100 * quantity))/100;

    parseFloat(price*100 * quantity)的计算结果是7693.000000000001   使用Math.round()方法四舍五入,再除100  即为正确的结果

    PS:顺便学到了一点:Math.ceil() Math.floor() Math.round() 的区别
    Math.ceil() 是向上取整
    Math.floor()是向下取整
    Math.round()是四舍五入
     
     
     
     
    <script type="text/javascript">  
    //保留两位小数
    //功能:将浮点数四舍五入,取小数点后2位
    function toDecimal(x) {
    var f = parseFloat(x);
    if (isNaN(f)) {
    return;
    }
    f = Math.round(x*100)/100;
    return f;
    }


    //制保留2位小数,如:2,会在2后面补上00.即2.00
    function toDecimal2(x) {
    var f = parseFloat(x);
    if (isNaN(f)) {
    return false;
    }
    var f = Math.round(x*100)/100;
    var s = f.toString();
    var rs = s.indexOf('.');
    if (rs < 0) {
    rs = s.length;
    s += '.';
    }
    while (s.length <= rs + 2) {
    s += '0';
    }
    return s;
    }

    function fomatFloat(src,pos){
    return Math.round(src*Math.pow(10, pos))/Math.pow(10, pos);
    }
    //四舍五入
    alert("保留2位小数:" + toDecimal(3.14159267));
    alert("强制保留2位小数:" + toDecimal2(3.14159267));
    alert("保留2位小数:" + toDecimal(3.14559267));
    alert("强制保留2位小数:" + toDecimal2(3.15159267));
    alert("保留2位小数:" + fomatFloat(3.14559267, 2));
    alert("保留1位小数:" + fomatFloat(3.15159267, 1));

    //五舍六入
    alert("保留2位小数:" + 1000.003.toFixed(2));
    alert("保留1位小数:" + 1000.08.toFixed(1));
    alert("保留1位小数:" + 1000.04.toFixed(1));
    alert("保留1位小数:" + 1000.05.toFixed(1));

    //科学计数
    alert(3.1415.toExponential(2));
    alert(3.1455.toExponential(2));
    alert(3.1445.toExponential(2));
    alert(3.1465.toExponential(2));
    alert(3.1665.toExponential(1));
    //精确到n位,不含n位
    alert("精确到小数点第2位" + 3.1415.toPrecision(2));
    alert("精确到小数点第3位" + 3.1465.toPrecision(3));
    alert("精确到小数点第2位" + 3.1415.toPrecision(2));
    alert("精确到小数点第2位" + 3.1455.toPrecision(2));
    alert("精确到小数点第5位" + 3.141592679287.toPrecision(5));
    </script>
     
  • 相关阅读:
    把图片转换成二进制--把二进制转换成图片
    .NET 读取视频文件
    winform ListView创建columnHeader的方法
    VUE篇 3、this指向问题、双向数据绑定 、局部/全局组件、父子传值 、兄弟传值(平行组件传值)
    爬虫 5 scrapy框架 虎牙scrapy示例
    爬虫 空气质量爬取分析
    爬虫 4 selenium
    爬虫3 request3高级 代理操作、模拟登录、单线程+多任务异步协程
    爬虫2 数据解析 --图片 、bs4 、xpath 、l乱码的一个解决方法 “|”
    vue篇 2、简单的轮播图 ajax、简单的音乐播放器、计算属性computed
  • 原文地址:https://www.cnblogs.com/gaoxue/p/3431255.html
Copyright © 2020-2023  润新知