Rumah >pembangunan bahagian belakang >Golang >Mengapa Pergi Cetak 9.12 untuk `912 * 0.01` tetapi 9.120000000000001 untuk `float64(912) * 0.01`?

Mengapa Pergi Cetak 9.12 untuk `912 * 0.01` tetapi 9.120000000000001 untuk `float64(912) * 0.01`?

Linda Hamilton
Linda Hamiltonasal
2024-12-16 15:33:15417semak imbas

Why Does Go Print 9.12 for `912 * 0.01` but 9.120000000000001 for `float64(912) * 0.01`?

Mengapa Percanggahan Antara Dua float64s?

Pertimbangkan coretan Go berikut:

fmt.Println(912 * 0.01)
fmt.Println(float64(912) * 0.01)

Sambil anda memahami dengan betul bahawa baris kedua mencetak 9.120000000000001, anda mungkin tertanya-tanya mengapa baris pertama mencetak 9.12 tanpa mengekori ...01.

Jawapannya terletak pada pengendalian ungkapan berterusan Go, seperti yang ditakrifkan dalam spesifikasi:

Ekspresi malar sentiasa dinilai betul-betul; nilai perantaraan dan pemalar itu sendiri mungkin memerlukan ketepatan yang jauh lebih besar daripada yang disokong oleh mana-mana jenis yang diisytiharkan dalam bahasa.

Oleh kerana 912 * 0.01 ialah ungkapan malar, ia dinilai dengan ketepatan yang melampau. Ketepatan yang sama ini dikekalkan apabila menghantar hasil ungkapan ini sebagai hujah kepada fmt.Println(). Pada dasarnya, fmt.Println(912 * 0.01) berkelakuan seolah-olah ia adalah fmt.Println(9.12), dengan 9.12 ialah perwakilan tepat bagi ungkapan yang dinilai.

Sebaliknya, apabila anda secara eksplisit menghantar 912 kepada float64 dalam baris kedua, kedua-dua operan pendaraban titik terapung dilemparkan secara tersirat ke terapung64. Memandangkan 0.01 tidak boleh diwakili dengan tepat dalam float64, kehilangan ketepatan berlaku, membawa kepada kehadiran ...01 dalam output.

Oleh itu, perbezaan dalam hasil berpunca daripada ketepatan yang dikekalkan semasa penilaian ungkapan berterusan dan tersirat pemutus terlibat dalam float64(912) * 0.01.

Atas ialah kandungan terperinci Mengapa Pergi Cetak 9.12 untuk `912 * 0.01` tetapi 9.120000000000001 untuk `float64(912) * 0.01`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn