js解决数字精度

/**

 * 数字运算(主要用于小数点精度问题)

 * @param {number} a 前面的值

 * @param {"+"|"-"|"*"|"/"} type 计算方式

 * @param {number} b 后面的值

 * @example

 * ```js

 * // 可链式调用

 * const res = computeNumber(1.3, "-", 1.2).next("+", 1.5).next("*", 2.3).next("/", 0.2).result;

 * console.log(res);

 * ```

 */

export function computeNumber(a, type, b) {

  /**

   * 获取数字小数点的长度

   * @param {number} n 数字

   */

  function getDecimalLength(n) {

    const decimal = n.toString().split(".")[1];

    return decimal ? decimal.length : 0;

  }

  /**

   * 修正小数点

   * @description 防止出现 `33.33333*100000 = 3333332.9999999995` && `33.33*10 = 333.29999999999995` 这类情况做的处理

   * @param {number} n

   */

  const amend = (n, precision = 15) => parseFloat(Number(n).toPrecision(precision));

  const power = Math.pow(10, Math.max(getDecimalLength(a), getDecimalLength(b)));

  let result = 0;

  a = amend(a * power);

  b = amend(b * power);

  switch (type) {

    case "+":

      result = (a + b) / power;

      break;

    case "-":

      result = (a - b) / power;

      break;

    case "*":

      result = (a * b) / (power * power);

      break;

    case "/":

      result = a / b;

      break;

  }

  result = amend(result);

  return {

    /** 计算结果 */

    result,

    /**

     * 继续计算

     * @param {"+"|"-"|"*"|"/"} nextType 继续计算方式

     * @param {number} nextValue 继续计算的值

     */

    next(nextType, nextValue) {

      return computeNumber(result, nextType, nextValue);

    }

  }

}

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值