我在golang中实现了一个端点,该端点可以接收具有不同精度长度的金额,即:

"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转换为字符串而不定义精度?

提前非常感谢您!

最佳答案

这应该有所帮助:

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))
}

09-06 15:31