在Go算术中处理浮点数精度?

时间:2017-09-22 23:05:38

标签: math go floating-point

我对在Go中准确地减去2个浮点数的方法感兴趣。

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

我在Javascript中使用了big.js库来解决这个问题。 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

2 个答案:

答案 0 :(得分:4)

  

Package big

     

导入“math / big”

     

func (*Float) String

func (x *Float) String() string
     

字符串格式x,如x.Text('g',10)。 (必须调用字符串   显式,Float.Format不支持%s动词。)

使用字符串输入并舍入输出,例如

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

对于十进制,根据定义,二进制浮点数是近似值。例如,十进制数0.1无法准确表示,大约为1.10011001100110011001101 * (2**(-4))

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

请参阅What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:1)

也许尝试github.com/shopspring/decimal

它自称为“go中的任意精度定点十进制数”的包。

注意:可以“仅”表示小数点后最多2 ^ 31位的数字。