ไม่เฉพาะเจาะจงกับการนำไปใช้ของ Python แต่ควรนำไปใช้กับฟังก์ชันสตริงทศนิยมหรือทศนิยม
จำนวนจุดลอยตัวนั้นเป็นเลขฐานสอง แต่เป็นสัญกรณ์ทางวิทยาศาสตร์ที่มีขีด จำกัด คงที่ของตัวเลขนัยสำคัญ
การผกผันของตัวเลขใด ๆ ที่มีตัวประกอบจำนวนเฉพาะที่ไม่ได้แชร์กับฐานจะส่งผลให้เกิดการแสดงจุดจุดซ้ำ ตัวอย่างเช่น 1/7 มีตัวประกอบสำคัญคือ 7 ซึ่งไม่ได้ใช้ร่วมกับ 10 ดังนั้นจึงมีการแทนทศนิยมที่เกิดซ้ำและเช่นเดียวกับ 1/10 ที่มีปัจจัยหลัก 2 และ 5 ซึ่งไม่ได้แชร์กับ 2 ; นี่หมายความว่า 0.1 ไม่สามารถถูกแทนด้วยจำนวนบิตที่แน่นอนหลังจากจุดจุด
เนื่องจาก 0.1 ไม่มีการนำเสนอที่แน่นอนฟังก์ชันที่แปลงการประมาณเป็นสตริงทศนิยมจะพยายามประมาณค่าบางค่าเพื่อไม่ให้ได้ผลลัพธ์ที่ไม่เข้าใจง่ายเช่น 0.1000000000004121
เนื่องจากจุดลอยตัวอยู่ในเครื่องหมายทางวิทยาศาสตร์การคูณใด ๆ ด้วยพลังของฐานจะมีผลเฉพาะส่วนเลขชี้กำลัง ตัวอย่างเช่น 1.231e + 2 * 100 = 1.231e + 4 สำหรับรูปแบบเลขฐานสิบและเช่นเดียวกันคือ 1.00101010e11 * 100 = 1.00101010e101 ในรูปแบบเลขฐานสอง ถ้าฉันคูณด้วยฐานที่ไม่ได้ใช้พลังงานตัวเลขที่สำคัญจะได้รับผลกระทบด้วย ตัวอย่างเช่น 1.2e1 * 3 = 3.6e1
ขึ้นอยู่กับอัลกอริทึมที่ใช้อาจพยายามเดาทศนิยมทั่วไปตามตัวเลขที่สำคัญเท่านั้น ทั้ง 0.1 และ 0.4 มีตัวเลขที่สำคัญเหมือนกันในไบนารี่เพราะทฤษฏีของมันนั้นถูกตัดทอนที่ (8/5) (2 ^ -4) และ (8/5) (2 ^ -6) ตามลำดับ หากอัลกอริทึมระบุรูปแบบ 8/5 sigfig เป็นทศนิยม 1.6 มันจะทำงานใน 0.1, 0.2, 0.4, 0.8, ฯลฯ มันอาจมีรูปแบบ sigfig เวทย์มนตร์สำหรับชุดค่าผสมอื่น ๆ เช่นทศนิยม 3 หารด้วยทศนิยม 10 และรูปแบบเวทย์มนตร์อื่น ๆ มีแนวโน้มที่จะเกิดขึ้นโดยการหารด้วย 10
ในกรณีของ 3 * 0.1 ตัวเลขที่มีนัยสำคัญไม่กี่คนที่ผ่านมาน่าจะแตกต่างจากการหารลอย 3 ด้วยการลอย 10 ทำให้อัลกอริทึมล้มเหลวในการจำหมายเลขเวทย์มนตร์สำหรับค่าคงที่ 0.3 ขึ้นอยู่กับความอดทนสำหรับการสูญเสียความแม่นยำ
แก้ไข:
https://docs.python.org/3.1/tutorial/floatingpoint.html
ที่น่าสนใจมีตัวเลขทศนิยมที่แตกต่างกันมากมายที่ใช้ร่วมกันเศษส่วนไบนารีใกล้เคียงที่สุดโดยประมาณ ตัวอย่างเช่นตัวเลข 0.1 และ 0.10000000000000001 และ 0.10000000000000000000055511151231257827021181583404541015625 ทั้งหมดประมาณ 3602879701896397/2 ** 55 เนื่องจากค่าทศนิยมทั้งหมดเหล่านี้ใช้การประมาณเดียวกัน ) == x
ไม่มีความอดทนต่อการสูญเสียความแม่นยำหาก float x (0.3) ไม่เท่ากับลอย y (0.1 * 3) ดังนั้น repr (x) จะไม่เท่ากับเท่ากับ repr (y)