我知道要得到一个基于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()
,并且您的代码将在浏览器功能可用的地方(或当它可用时(自动使用该功能。(小提琴(