你好,此问题属于产品功能限制,根本原因是 javascript 原生计算精度问题。不管我们如何调整我们的calc engine精度逻辑,最终还是基于原生的计算操作。
作为解决方法,建议可以尝试覆盖原生的toPrecision函数,进行四舍五入,但是这样一来,如果一个值不是因为精度问题,原生就是这样的话,也会被四舍五入。建议谨慎评估后使用
- var nativeToPrecisionFn = Number.prototype.toPrecision;
- Number.prototype.toPrecision = function () {
- var value = this.valueOf();
- if (true) {
- var valuestr = nativeToPrecisionFn.apply(this, arguments);
-
- var decimalPart = valuestr.split('.')[1], integerPart = valuestr.split('.')[0];
- var zeroMatchCount=0,nineMatchCount=0;
- var zeroMatchCount = decimalPart.match(/(0+)$/)?decimalPart.match(/(0+)$/)[0].length:0;
- var nineMatchCount = decimalPart.match(/(9+)$/)?decimalPart.match(/(9+)$/)[0].length:0;
- if (decimalPart && (zeroMatchCount > 7 || nineMatchCount > 7)) {
-
- var scale=Math.pow(10,(decimalPart.length-Math.max(zeroMatchCount,nineMatchCount)));
- console.log(decimalPart.length,Math.max(zeroMatchCount,nineMatchCount),scale);
- decimalPart.length-Math.max(zeroMatchCount,nineMatchCount)
- return Math.round(value*scale)/scale + "";
- }
-
- return valuestr;
- }
- return nativeToPrecisionFn.apply(this, arguments);
- }
复制代码
|