calc.wxs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435
  1. /**
  2. * WXS 版精确乘法(适配商品单价×数量,支持任意小数位数)
  3. * @param {number} price - 单价(整数/小数)
  4. * @param {number} quantity - 数量(整数/小数)
  5. * @returns {number} 精确结果
  6. */
  7. function preciseMultiply(price, quantity) {
  8. // 处理空值/非数字,默认转为 0
  9. price = typeof price === 'number' ? price : 0;
  10. quantity = typeof quantity === 'number' ? quantity : 0;
  11. // 转为字符串,获取小数位数(WXS 不支持模板字符串,用字符串拼接)
  12. var priceStr = price.toString();
  13. var quantityStr = quantity.toString();
  14. // 计算小数位数(无小数则为 0)
  15. var priceDecimalLen = priceStr.indexOf('.') !== -1 ? priceStr.split('.')[1].length : 0;
  16. var quantityDecimalLen = quantityStr.indexOf('.') !== -1 ? quantityStr.split('.')[1].length : 0;
  17. // 最大小数位数,确定放大倍数(10^maxLen)
  18. var maxDecimalLen = Math.max(priceDecimalLen, quantityDecimalLen);
  19. var scale = Math.pow(10, maxDecimalLen); // WXS 支持 Math 对象
  20. // 放大为整数(用 Math.round 修正浮点数误差)
  21. var intPrice = Math.round(price * scale);
  22. var intQuantity = Math.round(quantity * scale);
  23. // 整数相乘后还原(除以 scale²,避免结果放大)
  24. return (intPrice * intQuantity) / (scale * scale);
  25. }
  26. // 暴露函数(WXS 必须通过 module.exports 暴露才能被 WXML 调用)
  27. module.exports = ({
  28. preciseMultiply: preciseMultiply
  29. })