Excel รองรับทศนิยมแม่นยำเท่าใด


1

Excel สนับสนุนความแม่นยำอย่างไร ฉันพยายามคำนวณ0.800000000000001 / 2และรับผลลัพธ์ที่ไม่ถูกต้องของ0.40000000000000000000ที่ควรจะเป็น0.4000000000000005



ขอบคุณฉันสามารถใช้เครื่องมือใดในการคำนวณความแม่นยำที่สูงขึ้นได้บ้าง
Max Koretskyi aka ตัวช่วยสร้าง

3
ซ้ำซ้อนที่เป็นไปได้ของการเพิ่มมากกว่า 15 หลักใน Excel
DavidPostill

1
ขอเครื่องมือนอกหัวข้อ อย่างไรก็ตามดูซ้ำซ้อนสำหรับความคิดบางอย่าง
DavidPostill

คุณต้องการความแม่นยำเท่าใด ประเภทข้อมูลทศนิยม VBA รองรับความแม่นยำสูงกว่ามาก (25-30 ทศนิยม) ขึ้นอยู่กับขนาดของค่าและคุณสามารถเขียนรูทีนคณิตศาสตร์ที่คุณต้องการ
Ron Rosenfeld

คำตอบ:


3

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


1
@ fixer1234 ฉันได้อัปเดตคำตอบของฉันแล้วและให้เหตุผลที่ความแม่นยำหายไปที่ทศนิยม 15 ตำแหน่ง; ข้อ จำกัด ของ Floating Point
ejbytes

มันซับซ้อนกว่าบิต "15 หลัก" เล็กน้อย เลขทศนิยมนั้นไม่เหมือนกับBCDหรือการเข้ารหัสทศนิยมอื่น ๆ
Warren Young

@WarrenYoung ใช่ฉันรู้ เป็นเวลานานแล้วที่ฉันต้องเขียนอะไรลงไปในเครื่องหมายจุดลอยตัว หลังจากที่ฉันเรียนวิทยาศาสตร์คอมพิวเตอร์ในวิทยาลัยพวกเขาไม่ได้แจกแจงองศาเหล่านั้นง่ายเกินไปคุณต้องทำงานหนักเพื่อพวกเขา มันเป็นคำว่า "นำออกไป" ที่เรียบง่ายสำหรับผู้ค้นหาคำตอบพิเศษสำหรับคำถามเกี่ยวกับความแม่นยำของ Excel ฉันไม่ได้เขียนหนังสือ แต่ฉันอ้างอิงแหล่งข้อมูลที่ดี
ejbytes

2

นี่คือตัวอย่างของวิธีการใช้ชนิดข้อมูลทศนิยม 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

นี่คือตัวอย่างการใช้ข้อมูลของคุณ:

ป้อนคำอธิบายรูปภาพที่นี่

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