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

SQLite3 REAL类型存储数量的浮点精度问题咨询

SQLite3 REAL类型存储小数的精度问题解决思路

问题本质

SQLite的REAL类型基于IEEE-754双精度浮点数,这类二进制浮点数无法精确表示所有十进制小数——哪怕是你要存储的整数/1000(比如0.001),在二进制里也只能是近似值。这种精度偏差是浮点数的固有特性,不是简单操作能消除的。

为什么round()解决不了问题

round(value, 3)只是对浮点数做了表面的四舍五入,但返回的结果依然是一个二进制浮点数的近似值。比如你把1/1000用round处理后,底层存储的还是无法精确对应0.001的二进制值,后续读取或计算时,尾数位的非零值还是会冒出来。

根本解决方案

只要还用REAL类型,这个问题就没法从根源解决,必须换存储方式:

  • 优先方案:存储原始整数
    把要除以1000的整数直接存在INTEGER类型列里,比如原本要存5/1000=0.005,就存整数5。读取时再执行quantity / 1000.0计算,完全避免浮点数精度问题,存储和计算都精确。
  • 备选方案:用TEXT存储格式化字符串
    如果不需要对数值做运算,可以把值格式化为三位小数的字符串(比如"0.005")存在TEXT列里,但这种方式会失去数值运算的便利性。
  • 次选方案:用NUMERIC/DECIMAL类型
    SQLite没有原生的精确小数类型,但指定NUMERIC或DECIMAL后,它会根据数值自动映射为INTEGER或TEXT来保证精度,不过还是不如直接存原始整数可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:34:54