Go 如何在不指定精度的情况下将big.Rat转换为字符串?
我在golang中实现了一个端点,可以接收不同精度长度的金额,即: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
"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一起使用