192 votes

Convertir un float64 en un int dans Go

Comment convertir un float64 en un int dans Go ? Je sais que le strconv 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'un n'est pas une chaîne. Je sais que je peux utiliser fmt.Sprintf pour convertir n'importe quoi en chaîne, puis strconv en le type de données dont j'ai besoin, mais cette conversion supplémentaire semble un peu maladroite - existe-t-il un meilleur moyen pour faire ça?

296voto

David Grayson Points 22459
package main
import "fmt"
func main() {
  var x float64 = 5.7
  var y int = int(x)
  fmt.Println(y)  // outputs "5"
}

19voto

David Dooling Points 399

Le simple fait de convertir en int tronque le flottant, ce qui, si votre système représente en interne 2.0 sous la forme 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. Ainsi, pour obtenir une valeur plus précise, la conversion est encore plus compliquée que vous ne le pensez au départ :

 package main

import (
    "fmt"
    "strconv"
)

func main() {
    floats := []float64{1.9999, 2.0001, 2.0}
    for _, f := range floats {
        t := int(f)
        s := fmt.Sprintf("%.0f", f)
        if i, err := strconv.Atoi(s); err == nil {
            fmt.Println(f, t, i)
        } else {
            fmt.Println(f, t, err)
        }
    }
}

Code sur Go Playground

10voto

scaszoo Points 61

Un arrondi correct est probablement souhaité.

Par conséquent math.Round() est votre ami rapide (!). Les approches avec fmt.Sprintf et strconv.Atois() étaient de 2 ordres de grandeur plus lentes selon mes tests avec une matrice de valeurs float64 qui devaient devenir des valeurs int correctement arrondies.

 package main
import (
    "fmt"
    "math"
)
func main() {
    var x float64 = 5.51
    var y float64 = 5.50
    var z float64 = 5.49
    fmt.Println(int(math.Round(x)))  // outputs "6"
    fmt.Println(int(math.Round(y)))  // outputs "6"
    fmt.Println(int(math.Round(z)))  // outputs "5"
}

math.Round() renvoie une valeur float64 mais avec int() appliqué par la suite, je n'ai trouvé aucune incompatibilité jusqu'à présent.

6voto

Peanuts Points 362

Si c'est simplement de float64 à int, cela devrait fonctionner

 package main

import (
    "fmt"
)

func main() {
    nf := []float64{-1.9999, -2.0001, -2.0, 0, 1.9999, 2.0001, 2.0}

    //round
    fmt.Printf("Round : ")
    for _, f := range nf {
        fmt.Printf("%d ", round(f))
    }
    fmt.Printf("\n")

    //rounddown ie. math.floor
    fmt.Printf("RoundD: ")
    for _, f := range nf {
        fmt.Printf("%d ", roundD(f))
    }
    fmt.Printf("\n")

    //roundup ie. math.ceil
    fmt.Printf("RoundU: ")
    for _, f := range nf {
        fmt.Printf("%d ", roundU(f)) 
    }
    fmt.Printf("\n")

}

func roundU(val float64) int {
    if val > 0 { return int(val+1.0) }
    return int(val)
}

func roundD(val float64) int {
    if val < 0 { return int(val-1.0) }
    return int(val)
}

func round(val float64) int {
    if val < 0 { return int(val-0.5) }
    return int(val+0.5)
}

Les sorties:

 Round : -2 -2 -2 0 2 2 2 
RoundD: -2 -3 -3 0 1 2 2 
RoundU: -1 -2 -2 0 2 3 3 

Voici le code dans la cour de récréation - https://play.golang.org/p/HmFfM6Grqh

3voto

Codemaker Points 639

Vous pouvez utiliser la fonction int() pour convertir des données de type float64 int . De même, vous pouvez utiliser float64()

Exemple:

 func check(n int) bool { 
    // count the number of digits 
    var l int = countDigit(n)
    var dup int = n 
    var sum int = 0 

    // calculates the sum of digits 
    // raised to power 
    for dup > 0 { 
        **sum += int(math.Pow(float64(dup % 10), float64(l)))** 
        dup /= 10 
    } 

    return n == sum
} 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X