วิธีรับค่าอินพุตที่แน่นอนเป็นสองเท่าใน QDoubleSpinBox

ฉันต้องได้ค่าอินพุตที่แน่นอนของ double spin box ฉันตั้งค่าทศนิยม 8 หลักสำหรับ Spinbox ของฉัน พอผมพิมพ์ 0,6000000 สิ่งที่ได้มาตอน debug คือ 0,59999999999998 ดังในรูป (บางทีก็เป็น 0,6000000000002)

pic1

ฉันพยายามแปลงค่านี้เป็น 0,60000000 โดยใช้ QString::number และแปลงอีกครั้งเป็นสองเท่า สิ่งที่ได้รับคือค่าเก่าอีกครั้ง (0,59999999999998)

ป้อนคำอธิบายรูปภาพที่นี่ แต่เมื่อฉันพิมพ์ค่าเหล่านี้ออกมา มันจะพิมพ์ออกมาเป็น 0,60000000

เนื่องจากฉันมีการคำนวณหลังจากนั้น ดังนั้นฉันจึงต้องการค่าอินพุตที่แน่นอน ไม่เช่นนั้นการคำนวณของฉันจะผิด ในกรณีนี้ ผมควรจะเป็น 0,60000000 พอดี) ฉันจะทำเช่นนั้นได้อย่างไร?


person songvan    schedule 09.04.2019    source แหล่งที่มา
comment
อาจซ้ำซ้อนกับ คณิตศาสตร์จุดลอยตัวใช้งานไม่ได้หรือไม่   -  person TrebledJ    schedule 09.04.2019
comment
@TrebledJ: ขอบคุณ ปัญหาอาจจะเหมือนเดิม แต่ฉันยังไม่มีวิธีแก้ไขสำหรับกรณีนี้ :)   -  person songvan    schedule 09.04.2019
comment
ฉันคิดว่าคุณจะใช้อินพุตสองเท่าในการคำนวณและการคำนวณบางอย่าง บางทีคุณอาจต้องการดู C++ คำนวณได้แม่นยำกว่า double หรือ ยาวสองเท่า. มิฉะนั้น อาจเป็นการดีที่สุดที่จะใช้สตริงและการแก้ไขบรรทัดแทน (แต่นั่นดูเหมือนจะไม่ใช่สิ่งที่คุณพยายามทำให้สำเร็จ)   -  person TrebledJ    schedule 09.04.2019
comment
โอเค อ่านคำถามของคุณอีกครั้งเกี่ยวกับการต้องการค่าที่แน่นอน เพื่อความแม่นยำ คุณอาจต้องการโหลดไลบรารีอื่น (เช่น GNU Multiprecision Library ที่แนะนำใน ประเภททศนิยมใน Qt (C++) เช่นกัน) ฉันคิดว่า Boost มีไลบรารี่หลายความแม่นยำสำหรับคณิตศาสตร์ด้วย   -  person TrebledJ    schedule 09.04.2019
comment
@TrebledJ: ขอบคุณสำหรับความช่วยเหลือของคุณ ฉันลองด้วยวิธีแก้ไขปัญหาของตัวเอง QString valueAsText = locale().toString( p_value, 'f', decimals() ); ฉันได้ valueAsText ตรงตามที่ฉันพิมพ์ จากนั้นฉันสามารถรับส่วนจำนวนเต็มและส่วนทศนิยม (โดยใช้สตริง) แล้วแปลงอีกครั้งเป็น int และมันได้ผล :)   -  person songvan    schedule 09.04.2019
comment
สาเหตุของปัญหาคือ คุณกำลังพยายามแสดงจุดลอยตัวทศนิยมบนคอมพิวเตอร์ที่คิดเป็นจุดลอยตัวแบบไบนารี 0.6 ไม่สามารถแสดงได้อย่างสมบูรณ์ในไบนารี่จุดลอยตัว ค่าที่ใกล้เคียงที่สุดที่คุณจะได้คือ 0.1001(ซ้ำ) มันเล็กกว่าเล็กน้อย แต่เข้าใกล้ยิ่งไกลออกไป โปรดดู ตัวแปลงทศนิยมเป็นไบนารี่ และ เหตุใดจึงเป็น 1.1 + 2.2 != 3.3?   -  person jwernerny    schedule 09.04.2019