登录
首页 >  Golang >  Go问答

转换 big.Rat 为字符串,但不指定精度

来源:stackoverflow

时间:2024-03-24 12:27:37 342浏览 收藏

本文讨论如何将 `big.Rat` 类型转换为字符串,而不指定精度。在默认情况下,`big.Rat` 的 `FloatString` 方法会四舍五入小数部分,这可能导致不希望的结果。为了避免四舍五入,可以使用 `strconv.FormatFloat` 函数,该函数允许指定精度为 `-1`,从而保留原始数字的所有小数位。

问题内容

我有一个用 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))
}

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《转换 big.Rat 为字符串,但不指定精度》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>