Excel สนับสนุนความแม่นยำอย่างไร ฉันพยายามคำนวณ0.800000000000001 / 2
และรับผลลัพธ์ที่ไม่ถูกต้องของ0.40000000000000000000
ที่ควรจะเป็น0.4000000000000005
Excel สนับสนุนความแม่นยำอย่างไร ฉันพยายามคำนวณ0.800000000000001 / 2
และรับผลลัพธ์ที่ไม่ถูกต้องของ0.40000000000000000000
ที่ควรจะเป็น0.4000000000000005
คำตอบ:
Excel รองรับเลขทศนิยมซึ่งมีขีด จำกัด ทศนิยม 15 ตำแหน่ง นี่คือการสอบสวนและการอ้างอิง
ในการวิจัยเรื่องนี้พบว่ามีเพียง 15 หลักเท่านั้นที่ถูกเก็บไว้ในปริมาณเลขคณิตเนื่องจากมีเครื่องหมายทศนิยมเป็นที่สงสัย
หลังจากค้นหาผู้ร้ายที่น่าสงสัยนี้แล้วพบการอ้างอิงที่นี่: https://support.microsoft.com/en-us/kb/78113และที่นี่https://support.microsoft.com/en-us/kb/214118
ดังนั้นทศนิยม 15 ตำแหน่งคือค่าสูงสุดที่นำไปใช้ในจุดลอย นี่คือตัวอย่างเดียวกันใน 14 ตำแหน่งทศนิยม สังเกต 5 ในตำแหน่งทศนิยม 14 นำเสนอการสาธิตเพิ่มเติมเกี่ยวกับข้อ จำกัด ของ Floating Point
เพื่อทดสอบทฤษฎีแสดงความคิดเห็นโดยสมาชิกในฟอรั่มนี้ฉันตัดสินใจที่จะเพิ่มภาคผนวกนี้ ไม่ได้แม้แต่ใน VBa ตัวแปร Double สามารถเกินขีด จำกัด Floating Point ได้ ฉันใช้ความแม่นยำสองเท่าและส่งคืนค่าเป็นสตริงเพื่อแสดงให้เห็นถึงที่นี่:
ข้อยกเว้นสำหรับกฎ!
ขอขอบคุณคุณรอนแจสัน เกี่ยวกับภาพสุดท้ายเกี่ยวกับ VBa หากคุณกำลังใช้รหัส VBa แล้วการใช้งานVBa library function CDec()
ไม่จับแน่นอนความแม่นยำไม่ครอบคลุมในข้อ จำกัด ดังกล่าวข้างต้น อย่างไรก็ตามด้วยหนึ่งคำเตือนคุณต้องส่งคืนข้อมูลเป็นสตริงเพื่อวัตถุประสงค์ในการแสดงผล การอ้างอิงสามารถพบได้ที่นี่: http://www.techonthenet.com/excel/formulas/cdec.php
นี่คือตัวอย่างของวิธีการใช้ชนิดข้อมูลทศนิยม VBA ในการดำเนินการทางคณิตศาสตร์อย่างง่ายเพื่อให้ได้ความแม่นยำสูงกว่าความแม่นยำทศนิยม 15 หลักของ Excel
เห็นได้ชัดว่าคุณสามารถขยายสิ่งนี้เพื่อใช้สำหรับการดำเนินงานประเภทอื่น อย่างไรก็ตามหากความแม่นยำทศนิยม 28 หลักหรือหากช่วงตัวเลขที่อนุญาต (ดูวิธีใช้) ไม่เพียงพอคุณจะต้องใช้เครื่องมืออื่น
ตัวอย่างด้านล่างนี้ใช้สำหรับการบวกการคูณและการหารเท่านั้น แต่คุณสามารถขยายไปยังการดำเนินการอื่น ๆ หรือนำไปใช้แตกต่างกันไปตามสิ่งที่คุณต้องการ
โปรดทราบว่าผลลัพธ์จะถูกส่งคืนเป็นสตริง (ข้อความ) มิฉะนั้น Excel จะไม่สามารถแสดงผลลัพธ์ได้ หากคุณใช้งาน แต่เพียงผู้เดียวภายใน VBA คุณสามารถส่งคืนผลลัพธ์เป็น Variant / Decimal
Function HiPrecMath(sOp As String, ParamArray Factors() As Variant) As String
Dim V As Variant
V = Factors
If sOp Like "Add*" Then
HiPrecMath = vbADD(V)
ElseIf sOp Like "Mult*" Or sOp Like "Prod*" Then
HiPrecMath = vbMULT(V)
ElseIf sOp Like "Div*" Then
HiPrecMath = vbDIV(V)
End If
End Function
Private Function vbADD(F) As String
Dim vRes As Variant
For I = 0 To UBound(F)
vRes = vRes + CDec(F(I))
Next I
vbADD = vRes
End Function
Private Function vbMULT(F) As String
Dim vRes As Variant
vRes = F(0)
For I = 1 To UBound(F)
vRes = vRes * CDec(F(I))
Next I
vbMULT = vRes
End Function
Private Function vbDIV(F) As String
Dim vRes As Variant
vRes = F(0)
For I = 1 To UBound(F)
vRes = vRes / CDec(F(I))
Next I
vbDIV = vRes
End Function
นี่คือตัวอย่างการใช้ข้อมูลของคุณ: