我有一个 big.Float ,在 golang 标准 math/big 库中,我想把它四舍五入到最近的 big.Int 。我不知道怎么做

package main

import (
    "fmt"
    "math/big"
)

func main() {
    bfloat, _ := (&big.Float{}).SetString("1.8")

    // what to do here to round bfloat to nearest int?
    bint, _ := bfloat.Int(nil) // not this, this truncates

    fmt.Println(bint.String())
}

最佳答案

在调用 add 之前,您可以 0.5 Float.Int() 到它,然后你得到你想要的。

至少对于正数。如果数字为负数,则必须添加 -0.5,例如-0.6 被“四舍五入”为 -1.0

你可以这样做:

delta := 0.5
if bf.Sign() < 0 {
    delta = -0.5
}
bf.Add(bf, new(big.Float).SetFloat64(delta))
bint, _ := bf.Int(nil)

如果你想,你可以像这样简化这个添加:
bf.Add(bf, new(big.Float).SetFloat64(0.5*float64(bf.Sign())))

让我们测试它的一些值:
for _, s := range []string{"-0.8", "-0.3", "0.6", "1.1", "1.8"} {
    bf, _ := (&big.Float{}).SetString(s)

    delta := 0.5
    if bf.Sign() < 0 {
        delta = -0.5
    }
    bf.Add(bf, new(big.Float).SetFloat64(delta))
    bint, _ := bf.Int(nil)

    fmt.Printf("%5s => %2s\n", s, bint)
}

输出(在 Go Playground 上试试):
 -0.8 => -1
 -0.3 =>  0
  0.6 =>  1
  1.1 =>  1
  1.8 =>  2

关于go - 如何在数学/大浮点数中进行四舍五入?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60810163/

10-13 05:36