Jak przekonwertować float64 na int w Go? Wiem, że pakiet strconv
może być użyty do konwertowania czegokolwiek do lub z łańcucha znaków, ale nie między typami danych, w których jeden nie jest łańcuchem. Wiem, że mogę użyć fmt.Sprintf
do konwersji czegokolwiek na ciąg, a następnie strconv
go do potrzebnego mi typu danych, ale ta dodatkowa konwersja wydaje się nieco niezręczna - czy jest lepszy sposób na zrobienie tego?Konwersja float64 na int w Go
48
A
Odpowiedz
95
package main
import "fmt"
func main() {
var x float64 = 5.7
var y int = int(x)
fmt.Println(y) // outputs "5"
}
0
Wystarczy odlewania do int obcina pływak, który jeśli systemie wewnętrznie reprezentowania 2.0 jako 1.9999999999, nie dostaniesz to, czego oczekują. Różne konwersje printf radzą sobie z tym i prawidłowo zaokrąglają liczbę podczas konwersji. Tak, aby uzyskać bardziej dokładne wartości, konwersja jest jeszcze bardziej skomplikowana, niż mogłoby się najpierw spodziewać:
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)
}
}
}
kod na Go Playground
4
Jeśli jej prosto z float64 do int, to powinno działać
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)
}
Wyjścia:
Round : -2 -2 -2 0 2 2 2
RoundD: -2 -3 -3 0 1 2 2
RoundU: -1 -2 -2 0 2 3 3
Oto kod na placu zabaw - https://play.golang.org/p/HmFfM6Grqh
Powiązane problemy
- 1. konwersja podwójna na int
- 2. Konwersja std :: wstring na int
- 3. Konwersja BIGINT UNSIGNED na INT
- 4. Konwersja Haskell Float na Int
- 5. Miesiąc na int in Go
- 6. Android: konwersja kolorów na Int
- 7. konwersja int na std :: string
- 8. Konwersja struktury Go na JSON
- 9. Konwersja z edytowalnych na int w android
- 10. Konwersja String na int tablicy w java
- 11. konwersja int na krótki w C
- 12. Konwersja strumienia int na char w java
- 13. Konwersja wartości na int w F #
- 14. Konwersja z bajtu na int w java
- 15. Konwersja typu Int
- 16. Konwersja int ** do const int **
- 17. Konwersja int do booleans
- 18. Konwersja int do CGFloat
- 19. niejawna konwersja float/int
- 20. int z ciągiem w Go
- 21. Konwersja Json.Net JValue int
- 22. Konwersja Swift 3 z Int na ciąg
- 23. Konwersja int na bool z Json.NET
- 24. Konwersja int na hex z zerami wiodącymi
- 25. Dodaj dni na dzień w Go
- 26. Konwersja BitSet int
- 27. Go - przekształcić ciąg, który reprezentuje liczbę binarną w int
- 28. kompilacji Konwersja uint do int w C#
- 29. Konwersja int int *, a następnie z powrotem do int
- 30. Konwersja z int RGB, HEX
Nie wiedziałem, że to było takie proste - dzięki! –
@ David Grayson, więc czy ta konwersja jest taka sama jak Math.Floor (x), czy też upuszcza .7 ze względu na sposób, w jaki float64 zapisuje go w pamięci? –
@DavidLarsen Od specyfikacji Go: "Podczas przekształcania liczby zmiennoprzecinkowej na liczbę całkowitą, frakcja jest odrzucana (obcięcie w kierunku zera)". ([Przejdź do specyfikacji] (http://golang.org/ref/spec#Conversions)) – kvu787