首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Math.log()不准确--如何处理?

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

Stack Overflow用户
提问于 2015-07-11 08:17:59
回答 1查看 436关注 0票数 3

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

代码语言:javascript
复制
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()之外,还有其他更优雅的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-11 08:44:04

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

代码语言:javascript
复制
function log10(value){
  return -3 * (Math.log(value * 100)  / Math.log(0.001))  - 2;
}

示例:小提琴

作为sidenote,一些浏览器已经支持Math.log10功能,如果没有用以下方法实现,可以扩展Math以使用上面的函数:

代码语言:javascript
复制
if (!Math.log10) Math.log10 = function(value){
  return -3 * (Math.log(value * 100)  / Math.log(0.001))  - 2;
};

运行该初始化程序后,您可以简单地使用Math.log10(),您的代码将自动使用浏览器的功能(或者当它变为可用的时候)。(小提琴)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31355029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档