zoukankan      html  css  js  c++  java
  • JS

    前言

    js浮点数的计算存在精度不准的问题,解决方案:用整数与整数的加减乘除运算来规避该问题


    JS - 浮点数计算不精确

    let [num1,num2] = [0.1, 0.2];
    
    console.log(num1 + num2); // 0.30000000000000004
    console.log(num1 - num2); // -0.1
    console.log(num1 * num2); // 0.020000000000000004
    console.log(num1 / num2); // 0.5
    

    解决方案

    • number.js
    /**
     * 加 +
     * @param num1
     * @param num2
     * @returns {number}
     */
    function accAddition(num1, num2) {
        const num1Digits = (num1.toString().split('.')[1] || '').length;
        const num2Digits = (num2.toString().split('.')[1] || '').length;
        const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));
        return (Math.round(num1 * baseNum) + Math.round(num2 * baseNum)) / baseNum;
    }
    
    /**
     * 减 -
     * @param num1
     * @param num2
     * @returns {number}
     */
    function accSubtract(num1, num2) {
        const num1Digits = (num1.toString().split('.')[1] || '').length;
        const num2Digits = (num2.toString().split('.')[1] || '').length;
        const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));
        return (Math.round(num1 * baseNum) - Math.round(num2 * baseNum)) / baseNum;
    }
    
    /**
     * 乘 *
     * @param num1
     * @param num2
     * @returns {number}
     */
    function accMultiply(num1, num2) {
        const num1Digits = (num1.toString().split('.')[1] || '').length;
        const num2Digits = (num2.toString().split('.')[1] || '').length;
        const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));
        return (Math.round(num1 * baseNum) * Math.round(num2 * baseNum)) / baseNum / baseNum;
    }
    
    /**
     * 除 /
     * @param num1
     * @param num2
     * @returns {number}
     */
    function accDivision(num1, num2) {
        const num1Digits = (num1.toString().split('.')[1] || '').length;
        const num2Digits = (num2.toString().split('.')[1] || '').length;
        const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));
        return (Math.round(num1 * baseNum) / Math.round(num2 * baseNum));
    }
    
    export {
        accAddition,
        accMultiply,
        accSubtract,
        accDivision
    }
    

    结果验证

    import {accAddition, accSubtract, accMultiply, accDivision} from "@/utils/number";
    
    let [num1,num2] = [0.1, 0.2];
    
    console.log(accAddition(num1, num2)); // 0.3
    console.log(accSubtract(num1, num2)); // -0.1
    console.log(accMultiply(num1, num2)); // 0.02
    console.log(accDivision(num1, num2)); // 0.5
    

    - End -
    梦想是咸鱼
    关注一下吧
    以上为本篇文章的主要内容,希望大家多提意见,如果喜欢记得点个推荐哦
    作者:Maggieq8324
    本文版权归作者和博客园共有,欢迎转载,转载时保留原作者和文章地址即可。
  • 相关阅读:
    thinkphp3.2.3版本在windows本地apache环境运行正常,上传到centos服务器apache环境中出现:thinkphp 上传根目录不存在!请尝试手动创建:uploads/
    [POI2013]LUK-Triumphal arch
    【背包问题】
    2016 acm香港网络赛 A题. A+B Problem (FFT)
    tomcat部署项目的三种方式
    仿照ArrayList自己生成的MyList对象
    使用回调函数实现回文判断
    关于angularjs的model的一些问题
    关于使用Tomcat服务器出现413错误的解决办法(Request Entity Too Large)
    关于angularjs+typeahead的整合
  • 原文地址:https://www.cnblogs.com/maggieq8324/p/15211821.html
Copyright © 2011-2022 走看看