在Go中将float64转换为int

时间:2011-11-05 18:43:28

标签: go

如何在Go中将float64转换为int?我知道strconv包可用于将任何内容转换为字符串或从字符串转换,但不能在数据类型之间转换,其中一个不是字符串。我知道我可以使用fmt.Sprintf将任何内容转换为字符串,然后将strconv转换为我需要的数据类型,但这种额外的转换似乎有点笨拙 - 有更好的方法吗?

5 个答案:

答案 0 :(得分:148)

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

答案 1 :(得分:6)

如果它只是从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

答案 2 :(得分:4)

简单地转换为int会截断浮动,如果你的系统内部代表2.0为1.9999999999,那么你将无法得到你期望的结果。各种printf转换处理此问题并在转换时正确地舍入数字。因此,为了获得更准确的值,转换甚至比您预期的更复杂:

(
        {
        faceRectangle =         {
            height = 147;
            left = 130;
            top = 177;
            width = 147;
        };
        scores =         {
            anger = "0.000382305647";
            contempt = "0.304994762";
            disgust = "0.006239909";
            fear = "0.000005770166";
            happiness = "0.6252902";
            neutral = "0.06043929";
            sadness = "0.002567473";
            surprise = "0.00008030776";
        };
    },
        {
        faceRectangle =         {
            height = 48;
            left = 732;
            top = 35;
            width = 48;
        };
        scores =         {
            anger = "0.00000843479847";
            contempt = "0.00121067557";
            disgust = "0.00008578587";
            fear = "0.0000008104981";
            happiness = "0.9274825";
            neutral = "0.07090671";
            sadness = "0.000124009457";
            surprise = "0.000181075331";
        };
    }
)

Go Playground上的代码

答案 3 :(得分:4)

可能需要正确的舍入。

因此math.Round()是您的quick(!)朋友。 根据我的测试,使用float64值矩阵将fmt.Sprintf和strconv.Atois()的方法的速度降低了两个数量级。

package main
import (
    "fmt"
    "math"
)
func main() {
    var x float64 = 5.51
    var y float64 = 5.50
    var z float64 = 5.49
    fmt.Println(int(math.Round(x)))  // outputs "6"
    fmt.Println(int(math.Round(y)))  // outputs "6"
    fmt.Println(int(math.Round(z)))  // outputs "5"
}

math.Round()确实返回了float64值,但是之后应用了int(),到目前为止我还找不到任何不匹配项。

答案 4 :(得分:0)

您可以使用int()函数将float64类型的数据转换为整数。同样,您可以使用float64()

例如:

func check(n int) bool { 
    // count the number of digits 
    var l int = countDigit(n)
    var dup int = n 
    var sum int = 0 

    // calculates the sum of digits 
    // raised to power 
    for dup > 0 { 
        **sum += int(math.Pow(float64(dup % 10), float64(l)))** 
        dup /= 10 
    } 

    return n == sum
}