动爸 发表于 2023-4-20 18:50:36

spreadjs 简单两数相减 公式计算错误 多个好多小数位


直接输入 =235.5-235.7 就这样了 ,虽然右键设置单元格数字能解决 但是引用还是0.199999,导致我们现在自定义函数计算错误 非常紧急







本地excel不这样

动爸 发表于 2023-4-20 18:51:26

期望结果-0.2

Richard.Ma 发表于 2023-4-20 19:28:17

收到,这个看起来是存在浮点计算误差,暂时的解决方案,可以用round公式把结果包起来

问题我会报给研发调研,帖子保留处理

Richard.Ma 发表于 2023-4-23 11:23:54

问题的原因是 javascript 原生计算精度问题。不管我们如何调整我们的calc engine精度逻辑,最终还是要基于原生的计算操作。

作为解决方法,这里是一个建议,需要覆盖Number原生的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('.'), integerPart = valuestr.split('.');
      var zeroMatchCount=0,nineMatchCount=0;
      var zeroMatchCount = decimalPart.match(/(0+)$/)?decimalPart.match(/(0+)$/).length:0;
      var nineMatchCount = decimalPart.match(/(9+)$/)?decimalPart.match(/(9+)$/).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);
}
页: [1]
查看完整版本: spreadjs 简单两数相减 公式计算错误 多个好多小数位