Convierta un float64 a un int en Go
(3)
¿Cómo se convierte un float64 en int en Go? Sé que el paquete strconv
se puede usar para convertir cualquier cosa en una cadena, pero no entre tipos de datos donde una no es una cadena. Sé que puedo usar fmt.Sprintf
para convertir cualquier cosa en una cadena, y luego strconv
el tipo de datos que necesito, pero esta conversión extra parece un poco torpe. ¿Hay alguna forma mejor de hacerlo?
Si es simplemente de float64 a int, esto debería funcionar
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)
}
Productos:
Round : -2 -2 -2 0 2 2 2
RoundD: -2 -3 -3 0 1 2 2
RoundU: -1 -2 -2 0 2 3 3
Aquí está el código en el patio de recreo: https://play.golang.org/p/HmFfM6Grqh
Simplemente transfiriendo a un int trunca el float, que si su sistema representa internamente 2.0 como 1.9999999999, no obtendrá lo que espera. Las distintas conversiones de printf se ocupan de esto y redondean adecuadamente el número al convertir. Entonces, para obtener un valor más preciso, la conversión es aún más complicada de lo que podría esperar:
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 on Go Playground
package main
import "fmt"
func main() {
var x float64 = 5.7
var y int = int(x)
fmt.Println(y) // outputs "5"
}