Jak przekonwertować float64 na int w Go? Wiem, że strconv
pakiet może służyć do konwertowania czegokolwiek na lub z ciągu, ale nie między typami danych, w których jeden nie jest ciągiem. Wiem, że mogę użyć fmt.Sprintf
do przekonwertowania czegokolwiek na ciąg, a następnie strconv
na typ danych, którego potrzebuję, ale ta dodatkowa konwersja wydaje się nieco niezdarna - czy jest lepszy sposób na zrobienie tego?
124
int(Round(f))
aby ustawić float64 na int. Zobacz stackoverflow.com/a/62753031/12817546 .float64(i)
aby ustawić int na float64. Zobacz stackoverflow.com/a/62737936/12817546 .Odpowiedzi:
źródło
Zwykłe rzutowanie na int obcina liczbę zmiennoprzecinkową, która jeśli Twój system wewnętrznie reprezentuje 2.0 jako 1.9999999999, nie uzyskasz tego, czego oczekujesz. Różne konwersje printf radzą sobie z tym i odpowiednio zaokrąglają liczbę podczas konwersji. Aby uzyskać dokładniejszą wartość, konwersja jest jeszcze bardziej skomplikowana, niż można by się było spodziewać:
Code on Go Playground
źródło
Jeśli to po prostu od float64 do int, to powinno działać
Wyjścia:
Oto kod na placu zabaw - https://play.golang.org/p/HmFfM6Grqh
źródło
Możesz użyć
int()
funkcji, aby przekonwertowaćfloat64
dane typu na plikint
. Podobnie możesz użyćfloat64()
Przykład:
źródło
Prawdopodobnie pożądane jest prawidłowe zaokrąglenie.
Dlatego math.Round () jest twoim szybkim (!) Przyjacielem. Podejścia z fmt.Sprintf i strconv.Atois () były o 2 rzędy wielkości wolniejsze, zgodnie z moimi testami z macierzą wartości float64, które miały stać się poprawnie zaokrąglonymi wartościami int.
math.Round () zwraca wartość float64, ale po zastosowaniu funkcji int () nie mogłem do tej pory znaleźć żadnych niezgodności.
źródło