gpt4 book ai didi

go - 如何在不指定精度的情况下从 big.Rat 转换为字符串?

转载 作者:行者123 更新时间:2023-12-01 21:10:14 27 4
gpt4 key购买 nike

我在 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
}

我的问题和问题与 Marshal 方法有关,尤其是这一行:
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))
}

关于go - 如何在不指定精度的情况下从 big.Rat 转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62047621/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com