Как преобразовать big.Rat в строку без указания точности? - PullRequest
1 голос
/ 27 мая 2020

У меня есть конечная точка, реализованная в golang, которая может получать суммы с разной длиной точности, ie:

"123"
"123.12"
"123.123123"

Я использую big.Rat внутри для работы с этими числами следующим образом:

import (
    "encoding/json"
    "math/big"
)

type MyStruct struct {
    Amount   big.Rat `json:"amount"`
}

func (mystr *MyStruct) MarshalJSON() ([]byte, error) {
    type Alias MyStruct

    return json.Marshal(&struct {
        Amount json.Number `json:"amount"`
        *Alias
    }{
        Amount: json.Number(mystr.Amount.FloatString(2)),
        Alias:  (*Alias)(mystr),
    })
}

func (mystr *MyStruct) UnmarshalJSON(data []byte) error {
    type Alias MyStruct

    aux := &struct {
        Amount json.Number `json:"amount"`
        *Alias
    }{
        Alias: (*Alias)(mystr),
    }

    if err := json.Unmarshal(data, &aux); err != nil {
        return err
    }

    mystr.Amount = mystr.toRat(aux.Amount.String())

    return nil
}

func (mystr *MyStruct) toRat(val string) big.Rat {
    ratAmount := new(big.Rat)
    ratAmount.SetString(val)

    return *ratAmount
}

Моя проблема и вопрос связаны с методом Маршала, в частности с этой строкой:

Amount: json.Number(mystr.Amount.FloatString(2)),

Потому что, если сумма в json имеет число с более чем двумя десятичными знаками, происходит округление, и я не хочу этого, я просто хочу сохранить точно такое же число, которое было получено, когда я выполнял метод Unmarshal.

Это пример округления: https://play.golang.org/p/U6oi_aGc8lE

Есть ли способ преобразовать из big.Rat в строку без определения точности?

Заранее большое спасибо!

1 Ответ

1 голос
/ 27 мая 2020

Это должно помочь:

package main

import (
    "fmt"
    "math/big"
    "strconv"
)

func main() {
    n := new(big.Rat)

    n.SetString("34.999999")
    x,_ := n.Float64()
    fmt.Println("Result: "+strconv.FormatFloat(x, 'f', -1, 64))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...