JEPaaS 社区

 找回密码
 立即注册
JEPaaS低代码平台-官网
查看: 3222|回复: 0

js_double类型加减乘除防止精度损失解决办法

[复制链接]

0

主题

1

帖子

32

积分

凯特员工

积分
32
发表于 2021-6-30 14:12:07 | 显示全部楼层 |阅读模式
本帖最后由 凯特-邓绍银 于 2021-6-30 14:52 编辑

一、典型问题
x1.png
二、解决办法
x2.png
三、具体代码
可以将代码保证到个人脚本库,需要时使用:
  1. /**
  2. * 加法运算,避免数据相加小数点后产生多位数和计算精度损失。
  3. *
  4. * @param num1加数1 | num2加数2
  5. */
  6. function numAdd(num1, num2) {
  7.     var baseNum, baseNum1, baseNum2;
  8.     try {
  9.         baseNum1 = num1.toString().split(".")[1].length;
  10.     } catch (e) {
  11.         baseNum1 = 0;
  12.     }
  13.     try {
  14.         baseNum2 = num2.toString().split(".")[1].length;
  15.     } catch (e) {
  16.         baseNum2 = 0;
  17.     }
  18.     baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
  19.     return (num1 * baseNum + num2 * baseNum) / baseNum;
  20. };
  21. /**
  22. * 减法运算,避免数据相减小数点后产生多位数和计算精度损失。
  23. *
  24. * @param num1被减数 | num2减数
  25. */
  26. function numSub(num1, num2) {
  27.     var baseNum, baseNum1, baseNum2;
  28.     var precision;// 精度
  29.     try {
  30.         baseNum1 = num1.toString().split(".")[1].length;
  31.     } catch (e) {
  32.         baseNum1 = 0;
  33.     }
  34.     try {
  35.         baseNum2 = num2.toString().split(".")[1].length;
  36.     } catch (e) {
  37.         baseNum2 = 0;
  38.     }
  39.     baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
  40.     precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2;
  41.     return ((num1 * baseNum - num2 * baseNum) / baseNum)
  42.             .toFixed(precision);
  43. };
  44. /**
  45. * 乘法运算,避免数据相乘小数点后产生多位数和计算精度损失。
  46. *
  47. * @param num1被乘数 | num2乘数
  48. */
  49. function numMulti(num1, num2) {
  50.     var baseNum = 0;
  51.     try {
  52.         baseNum += num1.toString().split(".")[1].length;
  53.     } catch (e) {
  54.     }
  55.     try {
  56.         baseNum += num2.toString().split(".")[1].length;
  57.     } catch (e) {
  58.     }
  59.     return Number(num1.toString().replace(".", ""))
  60.             * Number(num2.toString().replace(".", ""))
  61.             / Math.pow(10, baseNum);
  62. };
  63. /**
  64. * 除法运算,避免数据相除小数点后产生多位数和计算精度损失。
  65. *
  66. * @param num1被除数 | num2除数
  67. */
  68. function numDiv(num1, num2) {
  69.     var baseNum1 = 0, baseNum2 = 0;
  70.     var baseNum3, baseNum4;
  71.     try {
  72.         baseNum1 = num1.toString().split(".")[1].length;
  73.     } catch (e) {
  74.         baseNum1 = 0;
  75.     }
  76.     try {
  77.         baseNum2 = num2.toString().split(".")[1].length;
  78.     } catch (e) {
  79.         baseNum2 = 0;
  80.     }
  81.     with (Math) {
  82.         baseNum3 = Number(num1.toString().replace(".", ""));
  83.         baseNum4 = Number(num2.toString().replace(".", ""));
  84.         return (baseNum3 / baseNum4) * pow(10, baseNum2 - baseNum1);
  85.     }
  86. };
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|JEPaaS 低代码平台社区 ( 京ICP备18023569号 )

GMT+8, 2024-4-28 18:14 , Processed in 0.063388 second(s), 23 queries .

Powered by 北京凯特伟业科技有限公司

Copyright © 2001-2021, JEPaaS.COM

快速回复 返回顶部 返回列表