У меня есть конечная точка, реализованная в 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 в строку без определения точности?
Заранее большое спасибо!