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