Comment convertir un float64 en int dans Go? Je sais que le strconv
package peut être utilisé pour convertir n'importe quoi vers ou à partir d'une chaîne, mais pas entre des types de données où l'on n'est pas une chaîne. Je sais que je peux utiliser fmt.Sprintf
pour convertir n'importe quoi en chaîne, puis strconv
le type de données dont j'ai besoin, mais cette conversion supplémentaire semble un peu maladroite - y a-t-il une meilleure façon de le faire?
125
int(Round(f))
pour définir un float64 sur un int. Voir stackoverflow.com/a/62753031/12817546 .float64(i)
pour définir un int sur un float64. Voir stackoverflow.com/a/62737936/12817546 .Réponses:
la source
Le simple cast en int tronque le flottant, ce qui, si votre système représente en interne 2.0 comme 1.9999999999, vous n'obtiendrez pas ce que vous attendez. Les différentes conversions printf traitent de cela et arrondissent correctement le nombre lors de la conversion. Donc, pour obtenir une valeur plus précise, la conversion est encore plus compliquée que ce à quoi vous pourriez vous attendre:
Code sur Go Playground
la source
Si c'est simplement de float64 à int, cela devrait fonctionner
Les sorties:
Voici le code dans la cour de récréation - https://play.golang.org/p/HmFfM6Grqh
la source
Vous pouvez utiliser la
int()
fonction pour convertirfloat64
les données de type en fichierint
. De même, vous pouvez utiliserfloat64()
Exemple:
la source
Un arrondi correct est probablement souhaité.
Par conséquent, math.Round () est votre ami rapide (!). Les approches avec fmt.Sprintf et strconv.Atois () étaient 2 ordres de grandeur plus lentes selon mes tests avec une matrice de valeurs float64 qui étaient destinées à devenir des valeurs int correctement arrondies.
math.Round () renvoie une valeur float64 mais avec int () appliqué par la suite, je n'ai pas pu trouver de discordance jusqu'à présent.
la source