Как преобразовать float64 в int в Go? Я знаю, что пакет strconv
может использоваться для преобразования чего-либо в строку или из нее, но не между типами данных, где одна не является строкой. Я знаю, что могу использовать fmt.Sprintf
для преобразования чего-либо в строку, а затем strconv
к типу данных, который мне нужен, но это дополнительное преобразование кажется немного неуклюжим - есть ли лучший способ сделать это?
Преобразование float64 в int в Go
Ответ 1
package main
import "fmt"
func main() {
var x float64 = 5.7
var y int = int(x)
fmt.Println(y) // outputs "5"
}
Ответ 2
Простое приведение к 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)
}
}
}
Код на игровой площадке Go
Ответ 3
Если это просто от 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
Ответ 4
Вы можете использовать функцию 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
}