Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何在不指定精度的情况下将big.Rat转换为字符串?_Go - Fatal编程技术网

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

Go 如何在不指定精度的情况下将big.Rat转换为字符串?,go,Go,我在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

我在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中的数量有一个超过两位小数的数字,就会进行舍入,我不想这样,我只想得到与之前完全相同的数字 在我执行解组方法时收到

这是舍入的一个示例:

有没有一种方法可以在不定义精度的情况下从big.Rat转换为string

提前非常感谢

这应该有帮助:

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

JSON编号始终为float64,因此,尽管您可以从/向其他Go类型封送/解封,但JSON中编号的精度限制始终为float64,因为这是JSON本身定义数字的方式。因此。。你的意思是没有必要使用大老鼠。在这种情况下,这就是你的意思吗?我不知道你需要什么。您可能需要
big.Rat
进行内部数据处理。您可能需要将
big.Rat
的精度持久化为JSON,在这种情况下,只需封送将封送为字符串而不是数字的
big.Rat
,因为这允许它保持任意精度。关于您的用例,我没有足够的信息来说明您需要做什么;我所知道的是JSON本身对所有数值都使用float64。我唯一需要的就是支持大量资金,这就是我所需要的。我甚至不需要对这些数字执行操作,只需读取它们,然后将它们作为字符串传递到另一层,而不进行任何舍入。但是如果你说json受float64限制,那么我认为没有必要使用big.RatGood!但是,如果这个数字太大,当我从rat转换为浮动一个非常大的数字时会发生什么呢?。有没有不使用浮点类型的方法?如果用大小数转换大数字,精度将使用定义的舍入模式进行舍入。要管理它,您应该使用shopspring提供的十进制软件包。但是big.Rat类型没有
SetMode
方法如何更改读取取整模式我读取了它,似乎它只能与big.Float类型not big.Rat一起使用