2011-11-05 9 views
48

¿Cómo se convierte un float64 a un 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 a una cadena, y luego strconv al tipo de datos que necesito, pero esta conversión extra parece un poco torpe. ¿Hay una mejor manera de hacerlo?Convierta un float64 a un int en Go

Respuesta

95
package main 
import "fmt" 
func main() { 
    var x float64 = 5.7 
    var y int = int(x) 
    fmt.Println(y) // outputs "5" 
} 
+1

No sabía que fuera así de simple, ¡gracias! –

+0

@David Grayson, ¿Esta conversión es igual a Math.Floor (x) o deja caer el .7 debido a la forma en que float64 lo guarda en la memoria? –

+1

@DavidLarsen Desde la especificación Go: "Al convertir un número de coma flotante en un número entero, la fracción se descarta (el truncamiento se dirige hacia cero)". ([Ir espec] (http://golang.org/ref/spec#Conversions)) – kvu787

0

simplemente echando a un int trunca el flotador, que si su sistema representan internamente como 1,9999999999 2.0, usted no conseguirá lo que usted espera. Las distintas conversiones de printf se ocupan de esto y redondean adecuadamente el número al convertir. Así que para obtener un valor más exacto, la conversión es aún más complicado de lo que primero era de 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) 
     } 
    } 
} 

Código de Go Playground

4

Si su 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) 
} 

Salidas:

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