golang将big.Float转换为big.Int [英] golang convert big.Float to big.Int

查看:549
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆