web-dev-qa-db-fra.com

Convertir un float64 en un entier dans Go

Comment convertir un float64 en int dans Go? Je sais que le package strconv peut être utilisé pour convertir n'importe quoi en chaîne, mais pas entre les types de données où l'un n'est pas une chaîne. Je sais que je peux utiliser fmt.Sprintf 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 de le faire?

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

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

6
Peanuts

Transmettre simplement à un int tronque le flottant, ce qui, si votre système représente 2.0 en interne sous la forme 1.9999999999, vous n'obtiendrez pas ce que vous attendiez. 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 prévu:

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

6
David Dooling

vous pouvez utiliser la fonction int () pour convertir les données de type float64 en un entier. De même, vous pouvez utiliser float64 ()

Par 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
} 
0
Codemaker