Math.log()不精确-如何处理

Math.log() inaccuracy - How to deal with it?

本文关键字:何处理 处理 不精确 log Math      更新时间:2023-09-26

我知道要得到一个基于10的对数,我必须使用Math.log((除以10的自然对数的常数。

var e1000 = Math.log(1000) / Math.LN10;
// Result: 2.9999999999999996 instead of 
//   expected 3.
console.log(e1000); 
// Result:  999.999999999999 instead of
//   expected 1000.
console.log(Math.pow(10, e1000));

但是:结果只是一个近似值。如果我在进一步的计算中使用计算值,不准确度会变得更糟。

我做错什么了吗?有没有比使用Math.ceil((更优雅的方法呢?

浮点舍入差是已知的,巧合的是2.9999正是MDN Math.Log页面中使用的示例。如您所述,Math.ceiling可用于调整结果。同样,您可以增加基数并使用较小的除法器来减少浮动误差的变化。例如

function log10(value){
  return -3 * (Math.log(value * 100)  / Math.log(0.001))  - 2;
}

示例:fiddle

顺便说一句,有些浏览器已经支持Math.log10功能,如果Math没有用实现,你可以扩展它来使用上面的功能

if (!Math.log10) Math.log10 = function(value){
  return -3 * (Math.log(value * 100)  / Math.log(0.001))  - 2;
};

在运行该初始值设定项之后,您可以简单地使用Math.log10(),并且您的代码将在浏览器功能可用的地方(或当它可用时(自动使用该功能。(小提琴(