Rumah >pembangunan bahagian belakang >Golang >Bagaimana Saya Boleh Mengelak Ralat Ketepatan Semasa Menukar `float64` kepada `int` dalam Go?

Bagaimana Saya Boleh Mengelak Ralat Ketepatan Semasa Menukar `float64` kepada `int` dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-12-17 02:24:25358semak imbas

How Can I Avoid Precision Errors When Converting `float64` to `int` in Go?

Mengelakkan Ralat Ketepatan dalam Penukaran Float-to-Int dalam Go

Apabila menukar nilai float64 kepada int dalam Go, pengaturcara sering menghadapi ralat ketepatan . Ralat ini timbul disebabkan oleh had sedia ada perwakilan nombor perduaan pada komputer.

Memahami Perwakilan Binari

Float64 mewakili nombor menggunakan standard IEEE-754, memperuntukkan 53 bit untuk digit dan 11 bit untuk eksponen. Walau bagaimanapun, nombor tertentu, seperti 100.55, tidak boleh diwakili dengan tepat dalam struktur binari terhingga ini.

Kod:

Kod berikut menunjukkan isu:

package main

import "fmt"

func main() {
    x := 100.55
    fmt.Println(x - float64(int(x)))    
}

Kod ini mengeluarkan 0.5499999999999972 dan bukannya yang dijangkakan 0.55. Sebabnya ialah perwakilan binari tidak boleh menyimpan 100.55 dengan tepat, dan nombor yang terhasil disimpan dalam x berbeza sedikit.

Penyelesaian:

  1. Bulatan untuk Paparan: Untuk mengelakkan output yang mengelirukan, bulatkan nombor titik terapung sebelum memaparkannya. Contohnya:

    fmt.Printf("%.2f\n", x) // Outputs: 0.55
  2. Gunakan Integer untuk Pengiraan: Jika ketepatan adalah penting, pertimbangkan untuk menggunakan integer untuk pengiraan. Sebagai contoh, kendalikan mata wang dalam sen berbanding dolar.

Kesimpulan:

Memahami batasan perwakilan binari dan menggunakan pengiraan pembundaran atau berasaskan integer boleh mengurangkan ralat ketepatan semasa menukar float64 kepada int dalam Go.

Atas ialah kandungan terperinci Bagaimana Saya Boleh Mengelak Ralat Ketepatan Semasa Menukar `float64` kepada `int` dalam Go?. 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