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

时间:2015-07-11 08:17:59

标签: javascript math

我知道为了得到一个基于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()?

1 个答案:

答案 0 :(得分:1)

浮点舍入差异是已知的,巧合的是2.9999是MDN Math.Log页面中使用的确切示例。 正如您所提到的,id4可用于结果。同样,您可以增加基数并使用较小的分隔符来减少浮动错误的变化。 e.g。

Expected: iterable over [hasProperty("id", "id1"), hasProperty("id", "id2"), hasProperty("id", "id3")] in any order
     but: Not matched: <A{id='id4'}>

示例:fiddle

作为旁注,有些浏览器已经支持Math。log10功能,如果没有实现,可以扩展Math.ceiling以使用上面的函数:

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

运行该初始化程序后,您只需使用Math,您的代码就会自动使用浏览器功能(当它变为可用时)。 (fiddle