首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >golang将big.Float转换为big.Int

golang将big.Float转换为big.Int
EN

Stack Overflow用户
提问于 2017-11-29 13:47:16
回答 3查看 4.9K关注 0票数 6

将big.Float转换为big.Int,我写了下面的代码,但它与uint64溢出,那么什么是正确的方法将big.Float转换为big.Int。

代码语言:javascript
复制
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)))
}
EN

回答 3

Stack Overflow用户

发布于 2017-11-29 14:07:05

由于uint64具有固定的大小,因此大于uint64的大整数总是会导致溢出。您应该在*Float上使用以下method

代码语言:javascript
复制
func (*Float) Int

所需的更改如下:

代码语言:javascript
复制
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
}

工作示例:https://play.golang.org/p/sEhH6iPkrK

票数 8
EN

Stack Overflow用户

发布于 2017-11-29 14:12:45

使用函数Float.Int(nil)

票数 0
EN

Stack Overflow用户

发布于 2021-08-08 17:24:33

我使用过一个常规的float64数字(而不是big.Float),发现通过字符串进行转换是最精确的方法。看看这个

注意:此示例用于float64 -> decimal(,20)转换。

代码语言:javascript
复制
func bigIntViaString(flt float64) (b *big.Int) {

    if math.IsNaN(flt) || math.IsInf(flt, 0) {
        return nil // illegal case
    }

    var in = strconv.FormatFloat(flt, 'f', -1, 64)

    const parts = 2

    var ss = strings.SplitN(in, ".", parts)

    // protect from numbers without period
    if len(ss) != parts {
        ss = append(ss, "0")
    }

    // protect from ".0" and "0." values
    if ss[0] == "" {
        ss[0] = "0"
    }

    if ss[1] == "" {
        ss[1] = "0"
    }

    const (
        base     = 10
        fraction = 20
    )

    // get fraction length
    var fract = len(ss[1])
    if fract > fraction {
        ss[1], fract = ss[1][:fraction], fraction
    }

    in = strings.Join([]string{ss[0], ss[1]}, "")
    // convert to big integer from the string
    b, _ = big.NewInt(0).SetString(in, base)
    if fract == fraction {
        return // ready
    }
    // fract < 20, * (20 - fract)
    var (
        ten = big.NewInt(base)
        exp = ten.Exp(ten, big.NewInt(fraction-int64(fract)), nil)
    )
    b = b.Mul(b, exp)
    return

}

https://play.golang.org/p/_lkyQ_0udjd

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47545898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档