舍入issus将NSDecimalNumber插入到Sqlite中

时间:2013-11-08 14:46:01

标签: ios sqlite fmdb nsdecimalnumber

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

1 个答案:

答案 0 :(得分:4)

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

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

对于DECIMAL(10,5):

  

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

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

您的选择:

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

如果您想存储货币,不使用浮点数学,但使用int存储分数(或类似面额)。