Perbezaan dalam Ketepatan Float64: Membongkar Nilai Yang Berbeza
Pertimbangkan contoh berikut dalam Go:
fmt.Println(912 * 0.01) fmt.Println(float64(912) * 0.01)
Yang pertama kenyataan mencetak 9.12, manakala yang kedua menghasilkan 9.120000000000001. Perbezaan ketara dalam ketepatan ini boleh membingungkan.
Menurut Spesifikasi Bahasa Go, ungkapan malar dinilai dengan tepat. Dalam kes ini, 912 * 0.01 ialah ungkapan malar. Menilainya dengan tepat menghasilkan 9.12, yang kemudiannya ditugaskan kepada float64(912 * 0.01) dan dihantar ke fmt.Println().
Sebagai alternatif, float64(912) * 0.01 juga merupakan ungkapan malar. Walau bagaimanapun, operan kiri, pada asalnya integer, dilemparkan secara eksplisit ke float64 sebelum pendaraban. Ini bermakna 0.01 ditukar secara tersirat kepada float64 juga, menghasilkan pendaraban antara dua nilai float64.
Yang penting, 0.01 tidak boleh diwakili dengan tepat sebagai float64. Ia dibundarkan kepada nilai yang boleh diwakili terdekat, yang memperkenalkan sedikit ketidaktepatan. Hasilnya, float64(912) * 0.01 menilai kepada 9.120000000000001, yang kemudiannya dicetak.
Ringkasnya, perbezaan dalam output timbul daripada penilaian ungkapan malar: sama ada lakonan berlaku sebelum atau semasa penilaian, dan sama ada ketidaktepatan diperkenalkan disebabkan oleh pengehadan ketepatan float64.
Atas ialah kandungan terperinci Mengapakah `912 * 0.01` Berbeza daripada `float64(912) * 0.01` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!