golang将big.Float转换为big.Int [英] golang convert big.Float to big.Int
本文介绍了golang将big.Float转换为big.Int的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
将big.Float转换为big.Int,我在下面编写了代码,但uint64溢出了,所以将big.Float转换为big.Int的正确方法是什么?
程序包主要导入"fmt"导入数学/大"func FloatToBigInt(val float64)* big.Int {bigval:= new(big.Float)bigval.SetFloat64(val)硬币:=新的(big.Float)coin.SetInt(big.NewInt(1000000000000000000))bigval.Mul(bigval,硬币)结果:= new(big.Int)f,_:= bigval.Uint64()result.SetUint64(f)返回结果}func main(){fmt.Println("vim-go")fmt.Println(FloatToBigInt(float64(10)))fmt.Println(FloatToBigInt(float64(20)))fmt.Println(FloatToBigInt(float64(30)))fmt.Println(FloatToBigInt(float64(40)))fmt.Println(FloatToBigInt(float64(50)))fmt.Println(FloatToBigInt(float64(100)))fmt.Println(FloatToBigInt(float64(1000)))fmt.Println(FloatToBigInt(float64(10000)))}
解决方案
大于 uint64
的大int总是会导致溢出,因为 uint64
具有固定的大小.您应该在 * Float
上使用以下方法:
func(* Float)整数
所需的更改将是:
func FloatToBigInt(val float64)* big.Int {bigval:= new(big.Float)bigval.SetFloat64(val)//根据需要设置精度.//bigval.SetPrec(64)硬币:=新的(big.Float)coin.SetInt(big.NewInt(1000000000000000000))bigval.Mul(bigval,硬币)结果:= new(big.Int)bigval.Int(result)//将转换后的数字存储在结果中返回结果}
工作示例: https://play.golang.org/p/sEhH6iPkrK >
convert big.Float to big.Int, i write code below, but it overflow with uint64, so what's the correct way to cenvert big.Float to big.Int.
package main
import "fmt"
import "math/big"
func FloatToBigInt(val float64) *big.Int {
bigval := new(big.Float)
bigval.SetFloat64(val)
coin := new(big.Float)
coin.SetInt(big.NewInt(1000000000000000000))
bigval.Mul(bigval, coin)
result := new(big.Int)
f,_ := bigval.Uint64()
result.SetUint64(f)
return result
}
func main() {
fmt.Println("vim-go")
fmt.Println(FloatToBigInt(float64(10)))
fmt.Println(FloatToBigInt(float64(20)))
fmt.Println(FloatToBigInt(float64(30)))
fmt.Println(FloatToBigInt(float64(40)))
fmt.Println(FloatToBigInt(float64(50)))
fmt.Println(FloatToBigInt(float64(100)))
fmt.Println(FloatToBigInt(float64(1000)))
fmt.Println(FloatToBigInt(float64(10000)))
}
解决方案
A big int bigger than uint64
will always cause an overflow as uint64
has fixed size. You should use the following method on *Float
:
func (*Float) Int
The changes required would be:
func FloatToBigInt(val float64) *big.Int {
bigval := new(big.Float)
bigval.SetFloat64(val)
// Set precision if required.
// bigval.SetPrec(64)
coin := new(big.Float)
coin.SetInt(big.NewInt(1000000000000000000))
bigval.Mul(bigval, coin)
result := new(big.Int)
bigval.Int(result) // store converted number in result
return result
}
Working example: https://play.golang.org/p/sEhH6iPkrK
这篇关于golang将big.Float转换为big.Int的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文