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
相关产品推荐
相关产品推荐

