【问题标题】:Rounding issus insert NSDecimalNumber into Sqlite舍入问题将 NSDecimalNumber 插入 Sqlite
【发布时间】:2013-11-08 14:46:01
【问题描述】:

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

【问题讨论】:

    标签: ios sqlite fmdb nsdecimalnumber


    【解决方案1】:

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

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

    对于 DECIMAL(10,5):

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

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

    您的选择:

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

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

    【讨论】:

    • 谢谢。事实证明,最简单的方法是在插入 Sqlite 之前转换为 NSString
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2015-04-25
    • 1970-01-01
    相关资源
    最近更新 更多