我有一个 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/