Maison >développement back-end >Golang >Comment convertir en toute sécurité float64 en uint64 dans Go ?

Comment convertir en toute sécurité float64 en uint64 dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-15 02:44:10207parcourir

How to Safely Convert float64 to uint64 in Go?

Convertir correctement float64 en uint64

Lorsque vous essayez de convertir un nombre float64 en uint64 dans Go, des problèmes de précision peuvent survenir. Cela entraîne souvent un comportement inattendu, car le composant fractionnaire de float64 est ignoré lors de la conversion.

Pour illustrer le problème :

package main

import "fmt"

func main() {
    var n float64 = 6161047830682206209
    fmt.Println(uint64(n))
}

Ce code affichera la valeur incorrecte suivante :

6161047830682206208

Le problème

La racine du problème réside dans les différences entre la façon dont les constantes et les nombres à virgule flottante sont représentés dans Go. Les constantes sont représentées avec une précision arbitraire, tandis que les nombres à virgule flottante suivent la norme IEEE 754. Cela signifie que même si les constantes peuvent représenter des valeurs sans perte de précision, les nombres à virgule flottante ont un nombre limité de bits (53 pour float64) disponibles pour stocker les chiffres.

La solution

Pour convertir correctement un float64 en uint64, vous devez vous assurer que le nombre float64 peut être représenté avec précision dans les 52 bits disponibles. Sinon, la précision sera perdue. Vous pouvez le faire en vérifiant que la valeur float64 se situe dans la plage représentable de uint64.

Vous trouverez ci-dessous un exemple de fonction qui vérifie la représentabilité avant le casting :

func Float64ToUint64(n float64) (uint64, error) {
    if (n < 0) || (n > math.MaxUint64) {
        return 0, errors.New("value out of range")
    }
    return uint64(n), nil
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn