在Go中将float64转换为int

在Go中,如何将float64转换为int? 我知道strconv包可以用来将任何内容转换为string或从string中转换,但不能在数据types之间转换。 我知道我可以使用fmt.Sprintf将任何东西转换为string,然后strconv到我需要的数据types,但是这个额外的转换看起来有点笨拙 – 有没有更好的方法来做到这一点?

 package main import "fmt" func main() { var x float64 = 5.7 var y int = int(x) fmt.Println(y) // outputs "5" } 

如果它只是从float64到int,这应该工作

 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) } 

输出:

 Round : -2 -2 -2 0 2 2 2 RoundD: -2 -3 -3 0 1 2 2 RoundU: -1 -2 -2 0 2 3 3 

这里是操场上的代码 – https://play.golang.org/p/HmFfM6Grqh

简单地转换为一个int会截断浮点数,如果你的系统在内部把2.0表示为1.9999999999,你就不会得到你所期望的。 各种printf转换处理这个和正确的整数转换时。 因此,为了获得更准确的价值,转换比您预期的要复杂得多:

 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) } } } 

游乐场上的代码