uniapp中digit不需要四舍五入的实现方法

在uniapp中,使用digit过滤器时默认会对数字进行四舍五入处理,但我的业务需求需要直接截断小数位而不进行四舍五入。例如:12.789希望显示为12.78而不是12.79。请问如何修改或自定义digit过滤器来实现这个功能?

2 回复

在uniapp中,若需保留小数但不四舍五入,可使用Math.floor()或字符串截取。例如:

let num = 3.14159;
let result = Math.floor(num * 100) / 100; // 保留两位小数
// 或
let str = num.toString();
result = parseFloat(str.substring(0, str.indexOf('.') + 3));

这样即可截断小数位,避免四舍五入。


在 UniApp 中,如果需要处理数字(如 digit)并避免四舍五入,可以使用以下方法:

方法一:使用 Math.floorMath.trunc 截断小数

  • Math.floor:向下取整,适用于正数。
  • Math.trunc:直接截断小数部分,适用于正负数。

示例代码

let num = 3.789;
let result1 = Math.floor(num * 100) / 100; // 保留两位小数,结果为 3.78
let result2 = Math.trunc(num * 100) / 100; // 保留两位小数,结果为 3.78

方法二:字符串处理(正则匹配)

通过正则表达式截取指定位数的小数,避免四舍五入。

示例代码

function truncateDecimal(num, digits) {
  let regex = new RegExp(`^-?\\d+(?:\\.\\d{0,${digits}})?`);
  let match = num.toString().match(regex);
  return match ? parseFloat(match[0]) : num;
}

let num = 5.6789;
let result = truncateDecimal(num, 2); // 结果为 5.67

方法三:乘以倍数后取整再还原

通过数学运算直接截断小数位。

示例代码

function toFixedNoRound(num, digits) {
  let factor = Math.pow(10, digits);
  return Math.trunc(num * factor) / factor;
}

let num = 9.998;
let result = toFixedNoRound(num, 2); // 结果为 9.99

注意事项

  • 如果数字是字符串,先使用 parseFloat() 转换。
  • 负数时建议用 Math.trunc,避免 Math.floor 的向下取整问题。

根据需求选择合适的方法即可实现不四舍五入的数字处理。

回到顶部