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?
package main
import "fmt"
func main() {
var x float64 = 5.7
var y int = int(x)
fmt.Println(y) // outputs "5"
}
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
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
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
}