浮点精度损失大的问题

时间:2018-10-17 11:03:56

标签: go

正在运行:

package main

import (
    "fmt"
    "math/big"
)

func main() {
    a := big.NewFloat(float64(2.1234))
    fmt.Println(a.Text(102,18))
}

我期望输出2.123400000000000000,但得到2.123400000000000176。

有人可以向我解释为什么我没有预期的电话号码吗?

1 个答案:

答案 0 :(得分:4)

big.NewFloat(float64(2.1234))

float64(2.1234)转换为Go float64(IEEE-754 64位浮点数),具有53位精度。

例如,

package main

import (
    "fmt"
    "math/big"
)

func main() {
    // 53 bits of precision (float64)
    a := big.NewFloat(float64(2.1234))
    fmt.Println(a.Text(102, 18))

    x := "2.1234"

    // 53 bits of precision
    f, _, err := big.ParseFloat(x, 10, 53, big.ToNearestEven)
    if err != nil {
        panic(err)
    }
    fmt.Println(f.Text(102, 18))

    // 256 bits of precision
    f, _, err = big.ParseFloat(x, 10, 256, big.ToNearestEven)
    if err != nil {
        panic(err)
    }
    fmt.Println(f.Text(102, 18))
}

游乐场:https://play.golang.org/p/z5iK90lQcD9

输出:

2.123400000000000176
2.123400000000000176
2.123400000000000000