ฉันจะระบุฐานสำหรับ Math.log () ใน JavaScript ได้อย่างไร


204

ฉันต้องการlogฟังก์ชั่นสำหรับ JavaScript แต่จำเป็นต้องเป็นฐาน 10 ฉันไม่เห็นรายชื่อใด ๆ สำหรับสิ่งนี้ดังนั้นฉันคิดว่ามันเป็นไปไม่ได้ มีพ่อมดคณิตศาสตร์ที่รู้วิธีแก้ปัญหานี้หรือไม่?


2
มีวิธีการทางคณิตศาสตร์ Math.log10 () นับตั้งแต่ ECMAScript 2015 สำหรับผู้ที่มาที่นี่ในภายหลัง
Haggra

คำตอบ:


329

สูตร / การเปลี่ยนแปลง "ฐาน" เอกลักษณ์

ค่าตัวเลขสำหรับลอการิทึมถึงฐาน 10 สามารถคำนวณด้วยข้อมูลเฉพาะตัวต่อไปนี้

ลอการิทึมสำหรับฐาน 10


เนื่องจากMath.log(x)ใน JavaScript จะส่งกลับลอการิทึมธรรมชาติของx(เหมือนกับln (x) ) สำหรับฐาน 10 คุณสามารถหารด้วยMath.log(10)(เหมือนกับln (10) ):

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

Math.LN10เป็นค่าคงที่ที่กำหนดไว้ล่วงหน้าในตัวMath.log(10)ดังนั้นฟังก์ชันนี้จึงเหมือนกับ:

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

10
ในความเป็นจริงสามารถใช้ฐานใดก็ได้ไม่ใช่แค่eหรือ 2 ตราบใดที่ลอการิทึมทั้งสองใช้ฐานเดียวกัน
Joey

16
เพิ่มภาพด้วยสูตรและเชื่อมโยงกับ Wikipedia หากคุณไม่สนใจ
Anurag

13
มีประโยชน์ในการคำนวณ Math.log (10) ทุกครั้ง ไม่จำเป็นต้องคำนวณอีกครั้งและจัดเก็บเนื่องจากคณิตศาสตร์กำหนดค่าคงนี้ไว้แล้วw3schools.com/jsref/jsref_ln10.asp
Michael Kariv

4
สำหรับฐานอื่น ๆ กว่า 10 เลื่อนลงไปที่คำตอบของ CMS หากเลื่อนลงและอ่านคำตอบดูเหมือนว่าทำงานหนักหลักการพื้นฐานคือreturn Math.log(n) / Math.log(base);
user56reinstatemonica8

4
ฉันพบว่ามีข้อผิดพลาดบางอย่างเกิดขึ้นที่นี่ซึ่งอาจจะเกี่ยวกับคณิตศาสตร์เลขทศนิยม ฉันลองใช้ฟังก์ชันด้านบนด้วยค่า 1,000 ในโหนดและได้ผลลัพธ์เป็น 2.9999999999999996 (แม้ว่าตัวเลขอื่น ๆ ที่ฉันลองเช่น 10, 100 และแม้แต่ 10,000 ก็ออกมาด้วยค่าที่ถูกต้อง)
user4815162342

64

ง่ายเพียงแค่เปลี่ยนฐานโดยหารด้วยบันทึก (10) แม้มีค่าคงที่ที่จะช่วยคุณ

Math.log(num) / Math.LN10;

ซึ่งเหมือนกับ:

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

52

คุณสามารถแบ่งลอการิทึมของค่าของคุณและลอการิทึมของฐานที่ต้องการนอกจากนี้คุณยังสามารถแทนที่Math.logวิธีการเพื่อยอมรับอาร์กิวเมนต์ฐานเสริม:

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

Math.log(5, 10);

15

คำตอบที่นี่จะทำให้เกิดปัญหาความแม่นยำที่ชัดเจนและไม่น่าเชื่อถือในบางกรณีการใช้งาน

> 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
ปรับความแม่นยำด้วยการปัดเศษแบบเลือก: (Math.round(Math.log(1000) / Math.LN10 * 1e6) / 1e6)
Shane Daniel


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

จากนั้นคุณสามารถทำได้

Math.log10(your_number);

หมายเหตุ:ตอนแรกฉันคิดว่าจะทำMath.prototype.log10 = ...เช่นนี้ แต่CMSผู้ใช้ชี้ให้เห็นว่าคณิตศาสตร์ไม่ทำงานในลักษณะนี้ดังนั้นฉันจึงแก้ไข.prototypeส่วนนี้


3
Mathเป็นวัตถุไม่ใช่ฟังก์ชันตัวสร้างดังนั้นจึงไม่มีprototypeคุณสมบัติ
CMS

ขอบคุณ CMS การพิสูจน์ควรทดสอบสิ่งต่าง ๆ ก่อนที่จะรู้สึก "แรงบันดาลใจ" ฉันจะกลับไปที่แผ่นวาดรูป
artlung

3
เพียงแค่ลบ.prototypeส่วน;)
CMS

9

FF 25+ รองรับMath.log10วิธีการ คุณอาจใช้ polyfill:

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

MDN แสดงเบราว์เซอร์ที่สนับสนุน

เบราว์เซอร์เดสก์ท็อป

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

เบราว์เซอร์มือถือ

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

1

Math.log10(x)! 😁

คำตอบที่ดีสำหรับฐานโดยพลการ แต่คำถามนั้นเกี่ยวกับ log base 10 และMath.log10(x)เป็นมาตรฐานสำหรับเบราว์เซอร์ทั้งหมดตั้งแต่ปี 2558 *

* ยกเว้น IE หากเป็นเรื่องสำคัญสำหรับคุณด้วยเหตุผลบางประการ


0

หากคุณมีตัวเลข x การใช้Math.log(x)จะเป็น lnx

หากต้องการแปลงเป็นฐานอื่นที่ไม่ใช่ e คุณสามารถใช้ฟังก์ชันต่อไปนี้:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.