Проблема в том, что потеря точности в большой. Поплавок - PullRequest
0 голосов
/ 17 октября 2018

Во время работы:

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 голосов
/ 17 октября 2018
big.NewFloat(float64(2.1234))

float64(2.1234) преобразуется в Go float64 (64-разрядная IEEE-754 с плавающей запятой) с точностью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...