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

标签 math go floating-point

我对在 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/

相关文章:

matlab - Matlab 的 perms 函数中的明显错误

c++ - 我应该保留此函数以查找第n个素数还是可以对其进行优化?

string - 从 Golang pkg/net/interface_windows.go 了解 bytePtrToString()

xml - 戈朗 : UnmarshalXMLAttr in encoding/xml

go - 变量在 if 语句中不可访问。语言设计?

你能在 C 中对不匹配的数据类型进行算术运算吗?

matlab - 如何处理上溢和下溢?

Javascript - 将 float 四舍五入到最接近的非零数字的最有效方法

C: 浮点运算的结果总是归一化的吗?

linux - gcc double printf 精度 - 错误输出