Odin语言core:encoding/json读取-10.0浮点数异常问题咨询
Odin JSON解析-10.0出现精度异常的原因分析
核心结论
这个现象不是浮点数特性导致的,而是Odin core:encoding/json 包的解析实现问题,属于不符合预期的行为,建议提交Bug。
原因拆解
浮点数表示的验证
-10.0是可以被f64/f32精确表示的数值(属于2的整数次幂的整数倍),所以直接通过10.0 * (-1)赋值能得到精确的-10.0,这完全符合浮点数的规则,排除浮点数本身的表示问题。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
相关产品推荐
相关产品推荐

