• JS中小数运算精度丢失的问题


    众所周知,JS中,小数之间进行运算会出现精度丢失的问题,比如

    再比如:

     这种问题的原因在此不再赘述,直接说解决办法:

    加法运算:

     //减法运算 
    1
    function numAdd(num1, num2) { 2 var baseNum, baseNum1, baseNum2 3 try { 4 baseNum1 = num1.toString().split('.')[1].length 5 } catch (e) { 6 baseNum1 = 0 7 } 8 try { 9 baseNum2 = num2.toString().split('.')[1].length 10 } catch (e) { 11 baseNum2 = 0 12 } 13 baseNum = Math.pow(10, Math.max(baseNum1, baseNum2)) 14 var precision = baseNum1 >= baseNum2 ? baseNum1 : baseNum2 //精度 15 return ((num1 * baseNum + num2 * baseNum) / baseNum).toFixed( 16 precision 17 ) 18 }

    减法运算

     1 //减法运算
     2         function numSub(num1, num2) {
     3             var baseNum, baseNum1, baseNum2;
     4             try {
     5                 baseNum1 = num1.toString().split(".")[1].length;
     6             } catch (e) {
     7                 baseNum1 = 0;
     8             }
     9             try {
    10                 baseNum2 = num2.toString().split(".")[1].length;
    11             } catch (e) {
    12                 baseNum2 = 0;
    13             }
    14             baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
    15             var precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2;
    16             return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision);
    17         };

    乘法运算:

     1    // 乘法运算
     2         function numMulti(num1, num2) {
     3             var baseNum = 0;
     4             try {
     5                 baseNum += num1.toString().split(".")[1].length;
     6             } catch (e) {
     7             }
     8             try {
     9                 baseNum += num2.toString().split(".")[1].length;
    10             } catch (e) {
    11             }
    12             return Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", "")) / Math.pow(10, baseNum);
    13         };

    除法运算

     1     // 除法运算,避免数据相除小数点后产生多位数和计算精度损失。
     2         function numDiv(num1, num2) {
     3             var baseNum1 = 0, baseNum2 = 0;
     4             var baseNum3, baseNum4;
     5             try {
     6                 baseNum1 = num1.toString().split(".")[1].length;
     7             } catch (e) {
     8                 baseNum1 = 0;
     9             }
    10             try {
    11                 baseNum2 = num2.toString().split(".")[1].length;
    12             } catch (e) {
    13                 baseNum2 = 0;
    14             }
    15             with (Math) {
    16                 baseNum3 = Number(num1.toString().replace(".", ""));
    17                 baseNum4 = Number(num2.toString().replace(".", ""));
    18                 return (baseNum3 / baseNum4) * pow(10, baseNum2 - baseNum1);
    19             }
    20         };
  • 相关阅读:
    TIOBE 2011年5月编程语言排行榜:C#和ObjectiveC上升趋势不减 狼人:
    20款绝佳的HTML5应用程序示例 狼人:
    为什么开发人员不能估算时间? 狼人:
    4款基于Django框架的开源软件推荐 狼人:
    jQuery 1.6正式版发布 狼人:
    设计者更喜欢什么操作系统 狼人:
    网络结点流网络浅析 By ACReaper
    效果实现SWFUpload在JQueryUI的Dialog中无法实现上传功能
    响应中断向量美妙的微机原理2013/5/2(2)
    内存图片IOS app启动动画的实现
  • 原文地址:https://www.cnblogs.com/fxwoniu/p/16278216.html
Copyright © 2020-2023  润新知