gpt4 book ai didi

math - 处理 Go 算术中的 float 精度?

转载 作者:IT王子 更新时间:2023-10-29 01:52:15 27 4
gpt4 key购买 nike

我对在 Go 中准确减去 2 个 float 的方法很感兴趣。

我尝试使用 math/big 库,但无法获得准确的结果。

我用过 big.js Javascript 中的库解决了这个问题。 Go算术有没有类似的库/方法?

    package main

import (
"fmt"
"math/big"
)

func main() {
const prec = 200
a := new(big.Float).SetPrec(prec).SetFloat64(5000.0)
b := new(big.Float).SetPrec(prec).SetFloat64(4000.30)
result := new(big.Float).Sub(a, b)
fmt.Println(result)
}
Result: 999.6999999999998181010596454143524169921875

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

最佳答案

Package big

import "math/big"

func (*Float) String

func (x *Float) String() string

String formats x like x.Text('g', 10). (String must be called explicitly, Float.Format does not support %s verb.)

使用字符串输入并对输出进行四舍五入,例如

package main

import (
"fmt"
"math/big"
)

func main() {
const prec = 200
a, _ := new(big.Float).SetPrec(prec).SetString("5000")
b, _ := new(big.Float).SetPrec(prec).SetString("4000.30")
result := new(big.Float).Sub(a, b)
fmt.Println(result)
fmt.Println(result.String())
}

输出:

999.6999999999999999999999999999999999999999999999999999999995
999.7

对于十进制,根据定义,二进制 float 是一个近似值。例如,十进制数0.1无法精确表示,它近似为1.10011001100110011001101 * (2**(-4))

你已经习惯了这种事情,因为你知道重复小数,有理数的近似值:1/3 = .333...3227/555 = 5.8144144144 ...

参见 What Every Computer Scientist Should Know About Floating-Point Arithmetic .

关于math - 处理 Go 算术中的 float 精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46374304/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com