我想将float64数字转换1.003为1003(整数类型)。我的实现方式是简单地将float64with 1000与转换为int。
float64
1.003
1003
1000
int
package main import "fmt" func main() { var f float64 = 1.003 fmt.Println(int(f * 1000)) }
但是,当我运行该代码时,我得到的1002不是1003。因为Go自动将1.003as 存储1.002999...在变量中。在Golang上执行此类操作的正确方法是什么?
1002
1.002999...
转到规格:转化:
数字类型之间的转换 将浮点数转换为整数时,将舍弃小数(截断为零)。
数字类型之间的转换
将浮点数转换为整数时,将舍弃小数(截断为零)。
因此,基本上,当您将浮点数转换为整数时,仅保留整数部分。
如果您只是想避免因用有限位表示而引起的错误,请在将0.5数字转换为之前添加到数字int。不需要外部库或函数调用(来自标准库)。
0.5
由于float -> int转换 不是舍入 而是 保留整数部分 ,这将为您提供所需的结果。考虑到可能更大或更小的表示形式:
float -> int
1002.9999 + 0.5 = 1003.4999; integer part: 1003 1003.0001 + 0.5 = 1003.5001; integer part: 1003
所以只需写:
var f float64 = 1.003 fmt.Println(int(f * 1000 + 0.5))
要将其包装到函数中:
func toint(f float64) int { return int(f + 0.5) } // Using it: fmt.Println(toint(f * 1000))
在Go Playground上尝试一下。
注意:
当您使用负数时请小心!例如,如果您的值为-1.003,则可能希望结果为-1003。但是,如果添加0.5到它:
-1.003
-1003
-1002.9999 + 0.5 = -1002.4999; integer part: -1002 -1003.0001 + 0.5 = -1002.5001; integer part: -1002
因此,如果您有负数,则必须:
1
将其整合到我们的辅助函数中:
func toint(f float64) int { if f < 0 { return int(f - 0.5) } return int(f + 0.5) }