ดังที่เราทราบ Javascript มีปัญหา (หรือคุณสมบัติ) บางประการในการคำนวณเลขทศนิยม ตัวอย่างเช่น:
console.log(0.1 + 0.2) // 0.30000000000000004
และเรารู้ว่าเราสามารถหลีกเลี่ยงได้โดยใช้ไลบรารีต่างๆ (เช่น ฉันใช้ bignumber.js ) และตอนนี้เราก็ได้สิ่งที่คาดหวังแล้ว:
console.log(Number(new BigNumber(0.1).plus(0.2))); // 0.3
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/6.0.0/bignumber.min.js"></script>
แต่
Bignumber.js มีข้อจำกัด:
ยอมรับค่าประเภทตัวเลข (สูงสุด 15 หลักสำคัญเท่านั้น) สตริงหรืออ็อบเจ็กต์ BigNumber
เราสามารถส่งผ่านสตริงได้ (เป็นไปได้) แต่วิธีนี้จะทำให้ตัวเลขบางส่วนหายไปจากจุดสิ้นสุด:
console.log(Number(new BigNumber(0.1).plus("198.43092534959501"))); // 198.530925349595, not 198.53092534959501
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/6.0.0/bignumber.min.js"></script>
ตอนนี้ฉันทำงานกับสกุลเงินดิจิทัล และบ่อยครั้งที่ฉันจัดการกับตัวเลขเช่น 198.43092534959501
และในกรณีนี้ ฉันได้รับข้อผิดพลาด (ตามที่คาดไว้):
console.log(Number(new BigNumber(0.1).plus(198.43092534959501))); // error
<script src="https://cdnjs.cloudflare.com/ajax/libs/bignumber.js/6.0.0/bignumber.min.js"></script>
ฉันรู้ว่าบางคนใช้ตัวคูณเพิ่มเติม แต่จะไม่ทำงานในกรณีที่ระบุไว้ข้างต้น หากคุณจัดการกับสกุลเงินดิจิทัล คุณจะรู้ว่าจริงๆ แล้วเราใช้งานได้กับค่าที่ไม่คูณและคูณ (เช่น 489964999999000000
และ 0.489964999999
) แต่เป้าหมายของฉันในตอนนี้คือการรวมยอดคงเหลือคำสั่งทั้งหมดสำหรับสกุลเงินที่แตกต่างกัน แต่มีตัวคูณที่แตกต่างกัน ดังนั้นฉันจึงไม่สามารถรวมค่าที่ไม่คูณได้ และดูเหมือนว่าฉันต้องรวมค่าที่คูณด้วยวิธีใดวิธีหนึ่ง
มันเป็นพื้นหลังเล็กๆ แต่ คำถามทั่วไปของฉันคือ:
วิธีบวก/คูณ/อื่นๆ เลขฐานสิบซึ่งมีมากกว่า 15 หลัก?
0.1
ไม่ใช่ตัวเลขทศนิยม แต่เป็นชนิดข้อมูลจุดลอยตัว และประเภทข้อมูลจุดลอยตัวเหล่านั้นไม่เหมาะสำหรับการคำนวณทศนิยมเนื่องจากมีวัตถุประสงค์ที่แตกต่างกัน และนั่นไม่ใช่เฉพาะกรณีของ JS เท่านั้น แต่ยังรวมถึงภาษาอื่นด้วย - person t.niese   schedule 03.04.2018