我有一个用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转换为字符串?
非常感谢您的提前!
发布于 2020-05-28 00:17:45
这应该是有帮助的:
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))
}https://stackoverflow.com/questions/62047621
复制相似问题