在 JSON 编组浮点数中保留尾随零
在 Go 中,json.Marshal() 函数经常从浮点数中删除尾随零-编组期间的点数。在某些情况下,这可能会导致精度损失。
问题:
当用尾随零(例如 40.0)编组 Go 程序的值时,json.Marshal () 输出不带零的值(例如 40)。如果外部程序需要尾随零的浮点数,此行为可能会出现问题。
解决方案 1(推荐):使用自定义浮点数
定义自定义浮点数键入并实现 MarshalJSON() 方法来控制 JSON 序列化。下面是一个示例:
type KeepZero float64 func (f KeepZero) MarshalJSON() ([]byte, error) { if float64(f) == float64(int(f)) { return []byte(strconv.FormatFloat(float64(f), 'f', 1, 32)), nil } return []byte(strconv.FormatFloat(float64(f), 'f', -1, 32)), nil }
在此自定义类型中,MarshalJSON() 方法将浮点数转换为具有一位小数的字符串(如果它是整数)或保留所有小数位(如果它不是整数)所有的number)。
示例:
type Pt struct { Value KeepZero Unit string } func main() { data, err := json.Marshal(Pt{Value: 40.0, Unit: "some_string"}) fmt.Println(string(data), err) }
此代码输出 {"Value":40.0,"Unit":"some_string"}
以上是当 Go JSON 中的编组浮动时如何保留尾随零?的详细内容。更多信息请关注PHP中文网其他相关文章!