簡體   English   中英

在 Go 中將 float64 轉換為 int

[英]Convert a float64 to an int in Go

在 Go 中如何將 float64 轉換為 int? 我知道strconv包可用於將任何內容轉換為字符串或從字符串轉換任何內容,但不能在不是字符串的數據類型之間進行轉換。 我知道我可以使用fmt.Sprintf將任何內容轉換為字符串,然后strconv其轉換為我需要的數據類型,但是這種額外的轉換似乎有點笨拙 - 有沒有更好的方法來做到這一點?

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

簡單地轉換為 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)
        }
    }
}

代碼操場

可能需要正確的舍入。

因此 math.Round() 是您的快速(!)朋友。 根據我的測試,使用 fmt.Sprintf 和 strconv.Atois() 的方法要慢 2 個數量級,其中 float64 值的矩陣旨在成為正確舍入的 int 值。

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() 之后,到目前為止我找不到任何不匹配的地方。

如果它只是從 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()函數將float64類型的數據轉換為int 同樣,您可以使用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
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM