showliuzp 2025-09-01 17:25 采纳率: 84.3%
浏览 7
已结题

golang mongo浮点存储


db.lu_list.insertOne({_id:1,guild_name:"第一个工会",guild_owner_uid:7,status:1,ration:0.12,contact:"+86",update_at:1754464571,createat:1754464571})
type LuList struct {
  Ratio       int64     `bson:"ratio"`
 Ratio       float64     `bson:"ratio"`
}

插入一个raion值为0.12的浮点数据,通过fmt.Printf("%+v\n", detail.Ratio),不管LuList 里ratio为int64还是float64,打印的结果都为0,我想让它打印出0.12

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2025-09-01 17:27
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你遇到的问题是由于 Go语言中类型不匹配 导致的。你希望将 0.12 这个浮点数值存储到 MongoDB,并且在从数据库中读取时能正确地以浮点数形式显示,但目前你的结构体字段类型设置为 int64float64,而实际打印结果却为 0


    ✅ 问题分析

    • 你插入的数据是 ration: 0.12,这是一个浮点值。
    • 如果你的结构体字段定义为 int64,那么 MongoDB 的浮点值会被自动转换为整数(即 0),因为无法直接映射。
    • 如果你使用的是 float64,那理论上应该可以正常显示 0.12
    • 但你在代码中可能错误地声明了两个同名字段,例如:
    type LuList struct {
        Ratio       int64     `bson:"ratio"`
        Ratio       float64   `bson:"ratio"`
    }
    

    ⚠️ 注意:Go语言不允许同一个结构体中有重复的字段名,所以这段代码其实是非法的,会导致编译错误。


    ✅ 正确做法

    你应该只保留一个字段,根据你要存储的类型选择 int64float64

    🔹 方案一:使用 float64 类型(推荐)

    如果你希望存储和读取浮点数,应该使用 float64 类型。

    ✅ 修改后的结构体定义:
    type LuList struct {
        Ratio       float64 `bson:"ratio"` // 使用 float64
        GuildName   string  `bson:"guild_name"`
        GuildOwnerUID int64   `bson:"guild_owner_uid"`
        Status      int     `bson:"status"`
        Contact     string  `bson:"contact"`
        UpdateAt    int64   `bson:"update_at"`
        CreateAt    int64   `bson:"createat"`
    }
    
    ✅ 插入数据示例:
    doc := bson.D{
        {"_id", 1},
        {"guild_name", "第一个工会"},
        {"guild_owner_uid", 7},
        {"status", 1},
        {"ratio", 0.12}, // 浮点数
        {"contact", "+86"},
        {"update_at", 1754464571},
        {"createat", 1754464571},
    }
    
    _, err := collection.InsertOne(context.TODO(), doc)
    if err != nil {
        log.Fatal(err)
    }
    
    ✅ 查询并打印:
    var detail LuList
    err = collection.FindOne(context.TODO(), bson.D{{"_id", 1}}).Decode(&detail)
    if err != nil {
        log.Fatal(err)
    }
    
    fmt.Printf("%+v\n", detail.Ratio) // 应该输出 0.12
    

    ✅ 方案二:使用 int64 类型(仅适用于整数)

    如果你确实想用 int64,则不能存储小数。比如 0.12 会被转成 0,这是 Go 的行为。

    type LuList struct {
        Ratio       int64 `bson:"ratio"` // 只能存整数
        ...
    }
    

    此时插入 0.12 会变成 0,无法满足需求。


    ✅ 总结

    | 问题 | 解决方案 | |------|----------| | 字段名重复 | 删除重复字段,只保留一个字段(如 Ratio float64) | | 类型不匹配 | 使用 float64 存储浮点数,避免被转换为 int64 | | 打印结果为 0 | 确保字段类型为 float64,并正确插入浮点值 |


    📌 最终建议

    使用 float64 类型来存储浮点数值,并在插入和查询时确保数据格式一致。


    如果你还有其他字段或结构体定义上的问题,也可以继续提供代码片段,我可以帮你进一步排查。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 9月16日
  • 已采纳回答 9月8日
  • 创建了问题 9月1日