Bagaimana cara mendapatkan nilai input ganda yang tepat di QDoubleSpinBox?

Saya perlu mendapatkan nilai input yang tepat dari double spin box. Saya menetapkan 8 digit desimal untuk Spinbox saya. Ketika saya mengetik 0,6000000 yang saya dapatkan di debug adalah 0,59999999999998 seperti pada gambar (kadang 0,6000000000002).

gambar1

Saya mencoba mengonversi nilai ini menjadi 0,60000000 menggunakan QString::number dan mengubahnya lagi menjadi dua kali lipat. Yang saya terima adalah nilai lama lagi (0,59999999999998).

masukkan deskripsi gambar di sini Namun saat saya mencetak nilai ini, hasilnya adalah 0,60000000.

Karena saya punya perhitungan setelah itu, jadi saya perlu nilai input yang tepat, kalau tidak perhitungan saya akan salah. Dalam hal ini saya harus menjadi tepat 0,60000000). Bagaimana saya bisa melakukan itu?


person songvan    schedule 09.04.2019    source sumber
comment
Kemungkinan duplikat Apakah matematika floating point rusak?   -  person TrebledJ    schedule 09.04.2019
comment
@TrebledJ: terima kasih, masalahnya mungkin sama, tapi saya masih belum punya solusi untuk kasus ini :)   -  person songvan    schedule 09.04.2019
comment
Saya berasumsi Anda akan menggunakan input ganda dalam beberapa aritmatika dan perhitungan? Mungkin Anda ingin melihat C++ menghitung lebih tepat daripada double atau ganda panjang. Jika tidak, mungkin yang terbaik adalah menggunakan string dan pengeditan baris (tapi sepertinya bukan itu yang ingin Anda capai).   -  person TrebledJ    schedule 09.04.2019
comment
Ah oke, baca kembali pertanyaan Anda tentang kebutuhan nilai pastinya. Untuk presisi, Anda mungkin ingin memuat perpustakaan lain (misalnya Perpustakaan Multiprecision GNU, direkomendasikan di Ketik desimal Qt (C++) juga). Saya pikir Boost juga memiliki perpustakaan multipresisi untuk matematika?   -  person TrebledJ    schedule 09.04.2019
comment
@TrebledJ: terima kasih atas bantuan Anda. Saya mencoba dengan solusi saya sendiri QString valueAsText = locale().toString( p_value, 'f', decimals() ); Saya mendapatkan valueAsText persis seperti yang saya ketik. Dari itu saya bisa mendapatkan bagian bilangan bulat dan bagian desimal (menggunakan string) dan kemudian mengubahnya lagi menjadi int. dan itu berhasil :)   -  person songvan    schedule 09.04.2019
comment
Akar masalahnya adalah Anda mencoba merepresentasikan floating point desimal pada komputer yang menggunakan floating point biner. 0,6 tidak dapat direpresentasikan secara sempurna dalam biner floating point. Nilai terdekat yang bisa Anda peroleh adalah 0,1001 (berulang). Ini sedikit lebih kecil, tetapi semakin dekat semakin jauh. Lihat pengonversi desimal ke biner dan Mengapa 1.1 + 2.2 != 3.3?.   -  person jwernerny    schedule 09.04.2019