首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不指定精度的情况下将big.Rat转换为字符串?

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

Stack Overflow用户
提问于 2020-05-28 00:04:34
回答 1查看 461关注 0票数 2

我有一个用golang实现的端点,它可以接收不同精度长度的金额,例如:

代码语言:javascript
复制
"123"
"123.12"
"123.123123"

我在内部使用big.Rat来处理这些数字,如下所示:

代码语言:javascript
复制
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转换为字符串?

非常感谢您的提前!

EN

回答 1

Stack Overflow用户

发布于 2020-05-28 00:17:45

这应该是有帮助的:

代码语言:javascript
复制
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))
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62047621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档