我知道,要得到一个基于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()之外,还有其他更优雅的方法吗?
发布于 2015-07-11 08:44:04
浮点舍入差是已知的,巧合的是,2.9999是MDN Math.Log页面中使用的确切示例。正如您所提到的,可以使用Math.ceiling来传递结果。同样,您可以增加基数,并使用较小的除法器来减少浮动错误的变化。例如:
function log10(value){
return -3 * (Math.log(value * 100) / Math.log(0.001)) - 2;
}示例:小提琴
作为sidenote,一些浏览器已经支持Math.log10功能,如果没有用以下方法实现,可以扩展Math以使用上面的函数:
if (!Math.log10) Math.log10 = function(value){
return -3 * (Math.log(value * 100) / Math.log(0.001)) - 2;
};运行该初始化程序后,您可以简单地使用Math.log10(),您的代码将自动使用浏览器的功能(或者当它变为可用的时候)。(小提琴)
https://stackoverflow.com/questions/31355029
复制相似问题