Come si converte un float64 in un int in Go? So che il pacchetto strconv
può essere utilizzato per convertire qualsiasi cosa da o verso una stringa, ma non tra tipi di dati in cui uno non è una stringa. So che posso usare fmt.Sprintf
per convertire qualsiasi cosa in una stringa, e quindi strconv
per il tipo di dati di cui ho bisogno, ma questa conversione extra sembra un po 'maldestra - c'è un modo migliore per farlo?Convertire un float64 in un int in Go
48
A
risposta
95
package main
import "fmt"
func main() {
var x float64 = 5.7
var y int = int(x)
fmt.Println(y) // outputs "5"
}
0
semplicemente gettando ad un int tronca il galleggiante, che se il sistema rappresentano internamente 2.0 come 1,9999,999999 millions, non si otterrà ciò che vi aspettate. Le varie conversioni di printf si occupano di questo e arrotondano correttamente il numero durante la conversione. Quindi, per ottenere un valore più accurato, la conversione è ancora più complicato di quanto si potrebbe prima aspettare:
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)
}
}
}
Codice in Go Playground
4
Se il suo semplicemente dal float64 a int, questo dovrebbe funzionare
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)
}
Uscite:
Round : -2 -2 -2 0 2 2 2
RoundD: -2 -3 -3 0 1 2 2
RoundU: -1 -2 -2 0 2 3 3
Ecco il codice nel parco giochi - 012.336.
Problemi correlati
- 1. Come convertire un valore int in stringa in Go?
- 2. Come convertire da [] byte a int in Programmazione Go
- 3. Come convertire An NSInteger in un int?
- 4. Come convertire un int in una stringa?
- 5. Come convertire int * in int
- 6. Come convertire un Int in un personaggio in Swift
- 7. Go esegue correttamente il marshal float64 su JSON?
- 8. Provare a convertire un int [] in int [,] utilizzando C#
- 9. Come convertire un array numpy da 'float64' a 'float'
- 10. Come convertire datatype: object in float64 in python?
- 11. Objective-C, come posso convertire un double in un int?
- 12. Come convertire un array di byte in un array int?
- 13. In Kotlin Come posso convertire un Int? a un numero
- 14. Come convertire l'array int in int?
- 15. Come posso convertire una stringa in un int in Python?
- 16. Come convertire in modo sicuro questo doppio in un int?
- 17. Come convertire un long in int in Java vs. swift?
- 18. Convertire un numero intero in un numero float in Golang
- 19. trasmesso da float32 a int in Go
- 20. Rileva overflow int. Firmato in Go
- 21. Come convertire QString in int?
- 22. Java: charAt convertire in int?
- 23. Converti Go [] byte in un C * char
- 24. Come convertire int in nsindexpath?
- 25. Converti un bigint in una stringa in Go
- 26. Come convertire un argomento da riga di comando in int?
- 27. come convertire un int in una maschera di bit?
- 28. Aggiungi cifra a un int senza convertire in stringa?
- 29. Come posso convertire un int a due byte in C#?
- 30. Arduino: Convertire un hex Sting "#FFFFFF" in 3 int
Non sapevo che era così semplice - grazie! –
@David Grayson, Quindi questa conversione è la stessa di Math.Floor (x) o fa cadere il .7 a causa del modo in cui il float64 lo salva in memoria? –
@DavidLarsen Dalla specifica Go: "Quando si converte un numero in virgola mobile in un numero intero, la frazione viene scartata (troncamento verso zero)". ([Vai a specifica] (http://golang.org/ref/spec#Conversions)) – kvu787