在Go中将float转换为int时如何舍入到最接近的int

Lev*_*ero 2 go

当将float转换为int时,将舍弃小数。什么是干净的转换方法,以便将其舍入到最接近的整数。

x := int(3.6) 应该等于4而不是3。

小智 10

在 Go 中将 float 转换为 int 时,您可以使用int(math.Round(f))四舍五入到最接近的整数。当浮点数设置为字节或符文时,小数点也会被丢弃。当它设置为字符串或布尔值时,不会发生截断。

\n
package main\n\nimport (\n  . "fmt"\n  . "math"\n)\n\nfunc main() {\n  f := 3.6\n  c := []interface{}{byte(f), f, int(Round(f)), rune(f), Sprintf("%.f", f), f != 0}\n  checkType(c)\n}\nfunc checkType(s []interface{}) {\n  for k, _ := range s {\n     Printf("%T %v\\n", s[k], s[k])\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Round 返回最接近的整数,从零开始四舍五入一半。请参阅https://golang.org/pkg/math/#Round。请参阅/sf/answers/4305263091/

\n

f := 3.6截断为 \xe2\x80\x9cuint8 3\xe2\x80\x9d,f为 \xe2\x80\x9cfloat64 3.6\xe2\x80\x9d,int(Round(f))向上舍入为 \xe2\x80\x9cint 4\xe2\x80\x9d, rune(f)截断为\xe2\x80\x9cint32 3\xe2\x80\x9d Sprintf("%.f", f)是 \xe2\x80\x9cstring 3.6\xe2\x80\x9d 并f != 0输出 \xe2\x80\x9cbool true\xe2\x80\x9d。

\n


Lev*_*ero 5

int(f+0.5) > = .5会使它向上舍入

  • 此外,如果您打算四舍五入到*最近的*整数,那么您的类型转换将无法很好地处理负数。 (3认同)