ข้อผิดพลาดในการปัดเศษไม่สุ่มและวิธีการใช้งานนั้นพยายามลดข้อผิดพลาดให้น้อยที่สุด ซึ่งหมายความว่าบางครั้งข้อผิดพลาดที่มองไม่เห็นหรือไม่มีข้อผิดพลาด
ยกตัวอย่างเช่น0.1
จะไม่ตรง0.1
เช่นnew BigDecimal("0.1") < new BigDecimal(0.1)
แต่0.5
เป็นว่า1.0/2
โปรแกรมนี้แสดงให้คุณเห็นคุณค่าที่แท้จริงที่เกี่ยวข้อง
BigDecimal _0_1 = new BigDecimal(0.1);
BigDecimal x = _0_1;
for(int i = 1; i <= 10; i ++) {
System.out.println(i+" x 0.1 is "+x+", as double "+x.doubleValue());
x = x.add(_0_1);
}
พิมพ์
0.1000000000000000055511151231257827021181583404541015625, as double 0.1
0.2000000000000000111022302462515654042363166809082031250, as double 0.2
0.3000000000000000166533453693773481063544750213623046875, as double 0.30000000000000004
0.4000000000000000222044604925031308084726333618164062500, as double 0.4
0.5000000000000000277555756156289135105907917022705078125, as double 0.5
0.6000000000000000333066907387546962127089500427246093750, as double 0.6000000000000001
0.7000000000000000388578058618804789148271083831787109375, as double 0.7000000000000001
0.8000000000000000444089209850062616169452667236328125000, as double 0.8
0.9000000000000000499600361081320443190634250640869140625, as double 0.9
1.0000000000000000555111512312578270211815834045410156250, as double 1.0
หมายเหตุ: ที่0.3
ปิดเล็กน้อย แต่เมื่อคุณไป0.4
ถึงบิตจะต้องเลื่อนลงหนึ่งบิตเพื่อให้พอดีกับขีด จำกัด 53 บิตและข้อผิดพลาดจะถูกยกเลิก อีกครั้งเป็นข้อผิดพลาดกลับครีพใน0.6
และ0.7
แต่สำหรับ0.8
ที่จะ1.0
เกิดข้อผิดพลาดจะถูกยกเลิก
การเพิ่มมัน 5 ครั้งควรจะสะสมข้อผิดพลาดไม่ใช่ยกเลิก
เหตุผลที่มีข้อผิดพลาดเกิดจากความแม่นยำที่ จำกัด เช่น 53-bits ซึ่งหมายความว่าในขณะที่จำนวนใช้บิตมากกว่าที่ได้รับขนาดใหญ่บิตต้องถูกปล่อยปิดท้าย ทำให้เกิดการปัดเศษซึ่งในกรณีนี้เป็นที่โปรดปรานของคุณ
คุณสามารถได้รับผลตรงกันข้ามเมื่อได้รับจำนวนที่น้อยกว่าเช่น0.1-0.0999
=> 1.0000000000000286E-4
และคุณเห็นข้อผิดพลาดมากกว่าเดิม
ตัวอย่างนี้คือสาเหตุที่ใน Java 6 ทำไม Math.round (0.49999999999999994) ส่งคืน 1ในกรณีนี้การสูญเสียบิตในการคำนวณทำให้ได้คำตอบที่แตกต่างกันมาก