Làm cách nào tôi có thể chỉ định cơ sở cho Math.log () trong JavaScript?


204

Tôi cần một logchức năng cho JavaScript, nhưng nó cần phải là cơ sở 10. Tôi không thể thấy bất kỳ danh sách nào cho việc này, vì vậy tôi cho rằng điều đó là không thể. Có bất kỳ pháp sư toán học nào ngoài kia biết một giải pháp cho việc này không?


2
Có một phương thức Math.log10 () kể từ ECMAScript 2015 cho những người đến đây sau này.
Haggra

Câu trả lời:


329

"Thay đổi cơ sở" Công thức / Danh tính

Giá trị số cho logarit đến cơ sở 10 có thể được tính với danh tính sau.

Logarit cho cơ sở 10


Math.log(x)trong JavaScript trả về logarit tự nhiên của x(giống như ln (x) ), đối với cơ sở 10, bạn có thể chia cho Math.log(10)(giống như ln (10) ):

function log10(val) {
  return Math.log(val) / Math.LN10;
}

Math.LN10là một hằng số được tích hợp sẵn cho Math.log(10), vì vậy hàm này về cơ bản giống với:

function log10(val) {
  return Math.log(val) / Math.log(10);
}

10
Trong thực tế, bất kỳ cơ sở nào cũng có thể được sử dụng, không chỉ e hoặc 2, miễn là cả hai logarit đều sử dụng cùng một cơ sở.
Joey

16
Đã thêm một hình ảnh với công thức và liên kết với Wikipedia nếu bạn không phiền.
Anurag

13
Lãng phí để tính Math.log (10) mỗi lần. Không cần thiết phải tính toán trước và lưu trữ vì Math xác định hằng số này đã w3schools.com/jsref/jsref_ln10.asp
Michael Kariv

4
Đối với các cơ sở khác hơn 10, hãy cuộn xuống câu trả lời của CMS . Nếu cuộn xuống và đọc một câu trả lời nghe có vẻ khó, nguyên tắc cơ bản làreturn Math.log(n) / Math.log(base);
user56reinstatemonica8

4
Tôi đã nhận thấy một số khả năng có lỗi ở đây, có lẽ phải làm với toán học dấu phẩy động. Tôi vừa thử chức năng trên với giá trị 1000 trong nút và nhận được kết quả là 2.9999999999999996. (Mặc dù các số khác tôi đã thử, chẳng hạn như 10, 100 và thậm chí 10000, đã đưa ra các giá trị chính xác.)
user4815162342

64

Dễ dàng, chỉ cần thay đổi cơ sở bằng cách chia cho nhật ký (10). Thậm chí còn có một hằng số để giúp bạn

Math.log(num) / Math.LN10;

tương tự như:

Math.log(num) / Math.log(10);

52

Bạn có thể chỉ cần chia logarit của giá trị của bạn và logarit của cơ sở mong muốn, bạn cũng có thể ghi đè Math.logphương thức để chấp nhận đối số cơ sở tùy chọn:

Math.log = (function() {
  var log = Math.log;
  return function(n, base) {
    return log(n)/(base ? log(base) : 1);
  };
})();

Math.log(5, 10);

15

câu trả lời ở đây sẽ gây ra vấn đề chính xác rõ ràng và không đáng tin cậy trong một số trường hợp sử dụng

> Math.log(10)/Math.LN10
1

> Math.log(100)/Math.LN10
2

> Math.log(1000)/Math.LN10
2.9999999999999996

> Math.log(10000)/Math.LN10
4

8
Điều chỉnh độ chính xác với làm tròn chọn lọc: (Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6)
Shane Daniel


13
Math.log10 = function(n) {
    return (Math.log(n)) / (Math.log(10));
}

Sau đó bạn có thể làm

Math.log10(your_number);

LƯU Ý: Ban đầu tôi nghĩ phải làm Math.prototype.log10 = ...điều này, nhưng người dùng CMS chỉ ra rằng Toán học không hoạt động theo cách này, vì vậy tôi đã chỉnh sửa .prototypephần này.


3
Mathlà một đối tượng, không phải là hàm tạo, do đó nó không có thuộc prototypetính.
CMS

cảm ơn CMS Chứng tỏ người ta nên kiểm tra mọi thứ trước khi cảm thấy "được truyền cảm hứng". Tôi sẽ quay trở lại bảng vẽ.
artlung

3
Chỉ cần xóa .prototypephần đó;)
CMS

9

FF 25+ hỗ trợ một Math.log10phương thức. Bạn có thể sử dụng polyfill:

if (!Math.log10) Math.log10 = function(t){ return Math.log(t)/Math.LN10; };

MDN liệt kê các trình duyệt được hỗ trợ .

Trình duyệt máy tính để bàn

Chrome    Firefox (Gecko) Internet Explorer   Opera   Safari
38        25 (25)         Not supported       25      7.1

Trình duyệt di động

Android         Chrome for Android    Firefox Mobile (Gecko)  IE Mobile      Opera Mobile    Safari Mobile
Not supported   Not supported         25.0 (25)               Not supported  Not supported   iOS 8


0

Nếu bạn có một số x, thì việc sử dụng về Math.log(x)cơ bản sẽ là lnx.

Để chuyển đổi nó thành một cơ sở khác ngoài e, bạn có thể sử dụng chức năng sau:

function(x){ return Math.log(x)/Math.log(10); }

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.