3

NSDeciamlNumber 3.33 插入数据库时​​变为0.32999999999999996 sql正确,但执行sql时数据变为0.32999999999999996。我正在使用 FMDB,我尝试了列类型 REAL、DECIMAL,它们有同样的问题。如果有办法将比例设置为 DECIMAL 列。我试过 DECIMAL(8,2),它没有帮助。

4

1 回答 1

4

据我所知,SQLite 不提供实际的十进制类型,并且所有类似浮点的数字都转换为双精度数。

http://www.sqlite.org/datatype3.html

对于十进制(10,5):

对于 TEXT 和 REAL 存储类之间的转换,如果保留数字的前 15 位有效十进制数字,SQLite 认为转换是无损和可逆的。如果无法将 TEXT 无损转换为 INTEGER 或 REAL,则使用 TEXT 存储类存储该值。

REAL(8 字节“双精度”)是浮点数据的常用类型,如果要存储 3.33 的实际值,则会遇到转换问题。

您的选择:

  • 存储一个字符串。速度慢,内存效率低,维护麻烦,但保证是正确的。
  • 如果您知道需要多少个小数点(例如,货币值),请存储一个 int。
  • 存储一个 BLOB,并以您喜欢的任何格式自行转换为二进制。
  • 存储一个真实的(双),并活出微小的差异。如果您不存储货币,这通常是可以的。

如果要存储货币,请不要使用浮点数学,而是使用 int 来存储美分(或类似面额)的数量。

于 2013-11-08T14:51:41.590 回答