¿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
48
A
Respuesta
95
package main
import "fmt"
func main() {
var x float64 = 5.7
var y int = int(x)
fmt.Println(y) // outputs "5"
}
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
Cuestiones relacionadas
- 1. Cómo convertir un valor int a cadena en Go?
- 2. conversión de float32 a int en Go
- 3. Convierta float a int en Objective-C
- 4. Convierta un valor rgb int negativo en bruto a un valor rgb de 3 números
- 5. cómo convertir Float64 a NSString en iOS
- 6. Cómo convertir de [] byte a int en Go Programming
- 7. En Kotlin ¿Cómo puedo convertir un int? a un Int
- 8. un NSNumber a un int
- 9. Convierta una cadena a int usando la consulta sql
- 10. Convierta un flujo a un FileStream en C#
- 11. Números aleatorios int64 y float64
- 12. Convierta programáticamente un video a FLV
- 13. Convierta un objeto a una cadena XML
- 14. Convierta un shapefile (.shp) a xml/json
- 15. Java: convierta un char [] a CharSequence
- 16. Convierta un objeto a System Guid
- 17. Convierta un archivo de especificaciones a debian
- 18. OpenXml: Convierta un XElement en un OpenXmlElement
- 19. Convierta un GIF en un archivo CUR
- 20. Python: Convierta una cadena en un entero
- 21. Cómo convertir un NSInteger a un int?
- 22. ¿Cómo convertir un Enum a un int?
- 23. Añadir un int a char *
- 24. Redondear un doble a int
- 25. Convierta un certificado CERT/PEM a un certificado PFX
- 26. Convierta un QVariant de un tipo personalizado a QString
- 27. Convierta un PDF a un PNG transparente con GhostScript
- 28. Dirección de un temporal en Go?
- 29. Convierta las coordenadas a un nombre de lugar
- 30. ¿Cuándo vaciar un archivo en Go?
No sabía que fuera así de simple, ¡gracias! –
@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? –
@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