Como converter um float64 em um int no Go? Eu sei que o strconv
pacote pode ser usado para converter qualquer coisa de ou para uma string, mas não entre tipos de dados onde um não é uma string. Sei que posso usar fmt.Sprintf
para converter qualquer coisa em string e depois strconv
no tipo de dados de que preciso, mas essa conversão extra parece um pouco desajeitada - há uma maneira melhor de fazer isso?
124
int(Round(f))
para definir um float64 para um int. Consulte stackoverflow.com/a/62753031/12817546 .float64(i)
para definir um int para um float64. Consulte stackoverflow.com/a/62737936/12817546 .Respostas:
fonte
A simples conversão para um int trunca o float, que se o seu sistema internamente representar 2.0 como 1.9999999999, você não obterá o que espera. As várias conversões printf lidam com isso e arredondam adequadamente o número ao converter. Portanto, para obter um valor mais preciso, a conversão é ainda mais complicada do que você pode esperar:
Code on Go Playground
fonte
Se for simplesmente de float64 para int, isso deve funcionar
Saídas:
Aqui está o código no playground - https://play.golang.org/p/HmFfM6Grqh
fonte
Você pode usar a
int()
função para converterfloat64
dados de tipo em umint
. Da mesma forma, você pode usarfloat64()
Exemplo:
fonte
O arredondamento correto é provavelmente desejado.
Portanto math.Round () é seu amigo rápido (!). As abordagens com fmt.Sprintf e strconv.Atois () foram 2 ordens de magnitude mais lentas de acordo com meus testes com uma matriz de valores float64 que deveriam se tornar valores int arredondados corretamente.
math.Round () retorna um valor float64, mas com int () aplicado posteriormente, não consegui encontrar nenhuma incompatibilidade até agora.
fonte