gin ShouldBindJSON后 浮点数精度丢失

1. 运行环境

mac golang 1.15

2. 问题描述?

使用验证绑定参数后 浮点数精度丢失、gin ShouldBindJSON后 浮点数精度丢失

// 查询资源类信息
type ResourceParam struct {
    Acom float64  `json:"acom" binding:"required"`
}
func (h *test) test(c *gin.Context) {
    // 参数校验 
    var params ResourceParam
    if err := c.ShouldBindJSON(&params); err != nil {
        return
    }

    fmt.Println(params)
    // 原值1.00、现在 输出 1
    return
}

3. 您期望得到的结果?

输出 1.00

4. 您实际得到的结果?

输出 1

最佳答案

当float64类型的值可以取整时,会自动取整。如 1.00 会等于 1,而 1.01 会等于 1.01,取整过程中类型并不会改变。

如果想要展示出现 1.00 的话,可以使用 fmt.Sprintf() 进行格式化输出,如 fmt.Sprintf("%.2f", float64(1))等于 1.00

3年前 评论
哪吒的狗腿子 (楼主) 3年前
讨论数量: 7

这种需求的话感觉需要手动格式化好些

3年前 评论
哪吒的狗腿子 (楼主) 3年前

当float64类型的值可以取整时,会自动取整。如 1.00 会等于 1,而 1.01 会等于 1.01,取整过程中类型并不会改变。

如果想要展示出现 1.00 的话,可以使用 fmt.Sprintf() 进行格式化输出,如 fmt.Sprintf("%.2f", float64(1))等于 1.00

3年前 评论
哪吒的狗腿子 (楼主) 3年前

这种情况比较麻烦,最简单的处理方式就是传string

3年前 评论
哪吒的狗腿子 (楼主) 3年前
Mericustar

标准库的 json 可以选择构造一个 decoder 然后使用 useNumber 方法,直接以字符串形式解析任意长度的数值,其底层以 strconv.ParseXXX 实现

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!