Percanggahan
In Go, the coretan kod berikut mendedahkan perbezaan yang menarik dalam titik terapung pengiraan:
package main import ( "fmt" ) func main() { x := 10.1 fmt.Println("x == 10.1: ", x == 10.1) fmt.Println("x*3.0 == 10.1*3.0:", x*3.0 == 10.1*3.0) }
Apabila dilaksanakan, kod ini menghasilkan keputusan yang tidak dijangka:
x == 10.1: true x*3.0 == 10.1*3.0: false
Semasa operasi titik terapung yang sama dilakukan, menggunakan sama ada pembolehubah yang diisytiharkan (x) atau literal (10.1), semakan kesaksamaan gagal.
Asal usul Perbezaan
Untuk memahami tingkah laku ini, seseorang mesti menyelidiki pengendalian nombor titik terapung oleh Go. Pemalar dan huruf nombor pada mulanya tidak ditaip dan mempunyai无限精度. Walau bagaimanapun, apabila ditugaskan kepada pembolehubah atau ditukar jenis, mereka mewarisi pengehadan jenis destinasi.
Apabila x := 10.1 ditugaskan, literal 10.1 kehilangan sedikit ketepatan disebabkan penukaran kepada apungan. Sebaliknya, 10.1*3.0 mengekalkan ketepatan penuhnya dalam pengiraan. Ini menyumbang kepada perbezaan yang diperhatikan dalam nilai dan semakan kesaksamaan palsu.
Dokumentasi dan Rasional
Tingkah laku ini digariskan dalam bahagian "Terapung" dalam catatan blog Go pada pemalar:
"Pemalar berangka hidup dalam ruang berangka ketepatan arbitrari; ia hanyalah nombor biasa. Tetapi apabila ia ditugaskan kepada pembolehubah nilai mesti boleh dimuatkan dalam destinasi."
Walaupun mekanisme di sebalik tingkah laku ini, terutamanya dalam kes dengan pemalar yang sangat besar, kekal agak kabur, ia memberikan pandangan yang berharga ke dalam selok-belok perwakilan titik terapung dalam Go. Pengetahuan ini membolehkan pembangun menjangka dan mengendalikan isu berkaitan ketepatan dalam kod mereka dengan berkesan.
Atas ialah kandungan terperinci Mengapa Persamaan Titik Terapung Gagal Masuk Apabila Membandingkan Pembolehubah dan Huruf?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!