Mengapa Dua float64 Ini Mempunyai Nilai Berbeza?
Pengenalan
Apabila bekerja dengan terapung -nombor mata, adalah penting untuk memahami had ketepatan. Pertimbangkan kod Go berikut:
fmt.Println(912 * 0.01) fmt.Println(float64(912) * 0.01)
(pautan Go Playground)
Barisan kedua menghasilkan hasil jangkaan "9.120000000000001" disebabkan ketepatan titik terapung had.
Soalan
Walau bagaimanapun, baris pertama mencetak "9.12" tanpa sebarang ketepatan mengekor. Ini menimbulkan persoalan: mengapa Go tidak melakukan pendaraban titik terapung untuk dua pemalar yang tidak ditaip dan kemudian menukarnya kepada literal 9.12?
Jawapan
Mengikut spesifikasi bahasa Go, ungkapan malar dinilai dengan tepat. Oleh itu, "912 * 0.01" dinilai dengan tepat, iaitu sama dengan "9.12".
Apabila anda menaip hantar operan pertama ke float64 (float64(912)), operan lain (0.01) juga secara tersirat taip cast ke float64. 0.01 tidak boleh diwakili tepat dalam float64, jadi ketepatan hilang di lokasi yang berbeza daripada contoh pertama. Ini menerangkan hasil berbeza yang diperhatikan apabila menggunakan fmt.Println() dengan ungkapan input yang berbeza.
Atas ialah kandungan terperinci Mengapa Pendaraban Titik Terapung Tidak Ditaip dan Ditaip dalam Go Menghasilkan Keputusan Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!