想问一下js大神,如何计算商品价格,能尽可能保证计算结果的准确性,商家能尽可能多赚少亏?
发布于 7 年前 作者 gang83 14157 次浏览 来自 官方Issues

因为小程序商品的单价都是几角几分的,例如¥0.15,¥0.2,¥0.26,¥0.13之类的,

并且每一个订单基本都是十几个到 二十几个商品,每个商品的数量都是十几个到二十几个,

例如:商品A¥0.15 ×15个,商品B¥0.2 ×20个,商品C¥0.25×18个,商品D¥0.13×17个等,

因为 JS数字精度不严谨,会出现丢失精度的情况,

想问一下有经验的前端朋友,在这种情况下,

如何计算商品价格,能尽可能保证计算结果的准确性,商家能尽可能多赚少亏?

最好是能贴个demo 🤣。。。。。。

5 回复

多简单的问题,把商品单价的单位 改成 分。

这样就不会有小数,整数计算就没问题了,微信支付就是这样设计的 避免了很多问题

  //解决加减乘除的精度问题
//加法计算 调用:Add(arg1,arg2)
  Add: function (arg1, arg2) {
    let r1, r2, m;
    try {
      r1 = arg1.toString().split(".")[1].length
    } catch (e) {
      r1 = 0
    }
    try {
      r2 = arg2.toString().split(".")[1].length
    } catch (e) {
      r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2))
    return ((arg1 * m + arg2 * m) / m)
  },

  //减法计算 调用:Subtr(arg1,arg2)
  Subtr: function (arg1, arg2) {
    let r1, r2, m, n;
    try {
      r1 = arg1.toString().split(".")[1].length
    } catch (e) {
      r1 = 0
    }
    try {
      r2 = arg2.toString().split(".")[1].length
    } catch (e) {
      r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2));
    n = (r1 >= r2) ? r1 : r2;
    return ((arg1 * m - arg2 * m) / m)
  },

  //乘法函数 调用:Mul(arg1,arg2)
  Mul: function (arg1, arg2) {
    let m = 0,
      s1 = arg1.toString(),
      s2 = arg2.toString();
    try {
      m += s1.split(".")[1].length
    } catch (e) { }
    try {
      m += s2.split(".")[1].length
    } catch (e) { }
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
  },

  //除法运算 调用:Div(arg1,arg2)
  Div: function (arg1, arg2) { 
    let t1 = 0,
      t2 = 0,
      r1, r2;
    try {
      t1 = arg1.toString().split('.')[1].length;
    } catch (e) { }
    try {
      t2 = arg2.toString().split('.')[1].length;
    } catch (e) { }
    r1 = Number(arg1.toString().replace('.', ''));
    r2 = Number(arg2.toString().replace('.', ''));
    return (r1 / r2) * Math.pow(10, t2 - t1);
  }

把价格转成整数计算完在转回去

以整数形式计算,在除以100等等

如¥0.15  => 15

¥0.15 * 10  => 15 * 10 = 150 => 150 / 100 = 1.5

若认为该回答有用,给回答者点个[ 有用 ],让答案帮助更多的人

回到顶部