Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menukar float64 dengan tepat kepada uint64 dalam Go?

Bagaimana untuk Menukar float64 dengan tepat kepada uint64 dalam Go?

DDD
DDDasal
2024-12-20 00:12:27165semak imbas

How to Accurately Convert a float64 to a uint64 in Go?

Cara Menukar Nombor Float64 kepada UInt64 Dengan Betul

Pertimbangkan kod Go berikut:

package main

func main() {
    var n float64 = 6161047830682206209
    println(uint64(n))
}

Yang dijangkakan output adalah untuk menukar nombor float64 kepada uint64, mengekalkan nilai. Walau bagaimanapun, output sebenar ialah 6161047830682206208, menunjukkan bahawa bahagian pecahan dibuang.

Memahami Isu

Percanggahan timbul disebabkan oleh had titik-apungan diwakili menggunakan piawaian IEEE 754. Dalam IEEE 754, 53 bit diperuntukkan untuk menyimpan digit dalam nombor titik terapung 64-bit (float64 dalam Go). Untuk pemalar yang diberikan, bilangan digit yang boleh diwakili adalah kurang daripada bilangan digit dalam pemalar itu sendiri.

Oleh itu, pemalar tidak boleh disimpan dengan tepat dalam pembolehubah float64, dan beberapa digit dibundarkan dan hilang. Ini boleh disahkan dengan mencetak nombor n float64 asal:

fmt.Printf("%f\n", n)
fmt.Printf("%d\n", uint64(n))

Penukaran Betul

Untuk menukar nombor float64 kepada uint64 dengan betul, adalah disyorkan untuk menggunakan fungsi Trunc, yang memotong bahagian pecahan nombor float64 dan mengembalikan integer bahagian:

package main

import "math"

func main() {
    var n float64 = 6161047830682206209
    println(uint64(math.Trunc(n)))
}

Pendekatan ini memastikan nilai integer ditukar tanpa kehilangan ketepatan.

Atas ialah kandungan terperinci Bagaimana untuk Menukar float64 dengan tepat kepada uint64 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