Преобразование float64 в int в Go



как конвертировать float64 в int в Go? Я знаю strconv пакет может использоваться для преобразования чего-либо в строку или из строки, но не между типами данных, где один не является строкой. Я знаю, что могу использовать fmt.Sprintf чтобы преобразовать что-либо в строку, а затем strconv Это тип данных, который мне нужен, Но это дополнительное преобразование кажется немного неуклюжим - есть ли лучший способ сделать это?

608   3  
go

3 ответов:

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 усекает float, который, если ваша система внутренне представляет 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)
        }
    }
}

код Go Playground

Comments

    Ничего не найдено.