You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odin语言core:encoding/json读取-10.0浮点数异常问题咨询

Odin JSON解析-10.0出现精度异常的原因分析

核心结论

这个现象不是浮点数特性导致的,而是Odin core:encoding/json 包的解析实现问题,属于不符合预期的行为,建议提交Bug。

原因拆解

  1. 浮点数表示的验证
    -10.0是可以被f64/f32精确表示的数值(属于2的整数次幂的整数倍),所以直接通过10.0 * (-1)赋值能得到精确的-10.0,这完全符合浮点数的规则,排除浮点数本身的表示问题。

  2. JSON解析器的潜在bug
    问题出在JSON包的浮点数解析逻辑上:大概率是解析负浮点数时,先处理了正数值部分,再对结果取负的过程中引入了精度丢失;或者是解析过程中使用了不恰当的中间计算步骤,导致原本精确的数值被错误转换。

验证建议

  • 测试其他负的精确浮点数(比如-2.0、-8.0),确认是否存在同样的解析异常;
  • 尝试用Odin的原生浮点数字符串解析函数直接解析"-10.0",对比JSON解析的结果,进一步定位是JSON包专属问题还是通用解析问题。

复现代码

Odin代码

package main

import "core:encoding/json"
import "core:fmt"
import "core:os"

main :: proc() {
    data, ok := os.read_entire_file_from_filename("test.json")
    if !ok {
        fmt.println("Data read incorrectly.")
        return
    }
    defer delete(data)

    json_data, err := json.parse(data)
    if err != .None {
        fmt.println("Json couldn't be parsed")
        return
    }
    defer json.destroy_value(json_data)

    root := json_data.(json.Object)
    value := root["val"].(json.Float)

    fmt.println("Value read:", value)

    value_negative_10: f64 = 10.0 * (-1)
    fmt.println("Value real:", value_negative_10)
}

test.json内容

{
  "val": -10.0
}

后续建议

这个解析结果明显不符合预期,你应该将该问题提交到Odin的官方仓库,附上你的复现代码、编译器版本(dev-2024-09)和系统信息(Kubuntu 24.04),帮助开发者定位修复。

内容的提问来源于stack exchange,提问作者Patrik Holub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 17:05:10