回答

收藏

js高精度计算函数

前端知识 前端知识 584 人阅读 | 0 人回复 | 2024-07-18

  1. var floatObj = function () {

  2.         /*
  3.          * 判断obj是否为一个整数
  4.          */
  5.         function isInteger(obj) {
  6.             return Math.floor(obj) === obj
  7.         }

  8.         /*
  9.          * 将一个浮点数转成整数,返回整数和倍数。如 3.14 >> 314,倍数是 100
  10.          * @param floatNum {number} 小数
  11.          * @return {object}
  12.          *   {times:100, num: 314}
  13.          */
  14.         function toInteger(floatNum) {
  15.             var ret = {times: 1, num: 0};
  16.             if (isInteger(floatNum)) {
  17.                 ret.num = floatNum;
  18.                 return ret
  19.             }
  20.             var strfi = floatNum + '';
  21.             var dotPos = strfi.indexOf('.');
  22.             var len = strfi.substr(dotPos + 1).length;
  23.             var times = Math.pow(10, len);
  24.             var intNum = parseInt(floatNum * times + 0.5, 10);
  25.             ret.times = times;
  26.             ret.num = intNum;
  27.             return ret
  28.         }

  29.         /*
  30.          * 核心方法,实现加减乘除运算,确保不丢失精度
  31.          * 思路:把小数放大为整数(乘),进行算术运算,再缩小为小数(除)
  32.          *
  33.          * @param a {number} 运算数1
  34.          * @param b {number} 运算数2
  35.          * @param op {string} 运算类型,有加减乘除(add/subtract/multiply/divide)
  36.          *
  37.          */
  38.         function operation(a, b, op) {
  39.             var o1 = toInteger(a);
  40.             var o2 = toInteger(b);
  41.             var n1 = o1.num;
  42.             var n2 = o2.num;
  43.             var t1 = o1.times;
  44.             var t2 = o2.times;
  45.             var max = t1 > t2 ? t1 : t2;
  46.             var result = null;
  47.             switch (op) {
  48.                 case 'add':
  49.                     if (t1 === t2) { // 两个小数位数相同
  50.                         result = n1 + n2
  51.                     } else if (t1 > t2) { // o1 小数位 大于 o2
  52.                         result = n1 + n2 * (t1 / t2)
  53.                     } else { // o1 小数位 小于 o2
  54.                         result = n1 * (t2 / t1) + n2
  55.                     }
  56.                     return result / max;
  57.                 case 'subtract':
  58.                     if (t1 === t2) {
  59.                         result = n1 - n2
  60.                     } else if (t1 > t2) {
  61.                         result = n1 - n2 * (t1 / t2)
  62.                     } else {
  63.                         result = n1 * (t2 / t1) - n2
  64.                     }
  65.                     return result / max;
  66.                 case 'multiply':
  67.                     result = (n1 * n2) / (t1 * t2);
  68.                     return result;
  69.                 case 'divide':
  70.                     result = (n1 / n2) * (t2 / t1);
  71.                     return result
  72.             }
  73.         }

  74.         // 加减乘除的四个接口
  75.         function add(a, b) {
  76.             return operation(a, b, 'add')
  77.         }

  78.         function subtract(a, b) {
  79.             return operation(a, b, 'subtract')
  80.         }

  81.         function multiply(a, b) {
  82.             return operation(a, b, 'multiply')
  83.         }

  84.         function divide(a, b) {
  85.             return operation(a, b, 'divide')
  86.         }

  87.         // exports
  88.         return {
  89.             add: add, subtract: subtract, multiply: multiply, divide: divide
  90.         }
  91.     }();
复制代码
使用:

  1. var result=floatObj.add(0.37,3.141526)//加法
复制代码
分享到:
回复

使用道具 举报

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

本版积分规则

42 积分
10 主题
+ 关注