我在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中的数量包含一个小数点后两位以上的数字,那么会四舍五入,而我不想这样做,我只想保留与
当我执行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))
}