ios - 四舍五入问题将 NSDecimalNumber 插入到 Sqlite 中

标签 ios sqlite fmdb nsdecimalnumber

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

最佳答案

据我所知,SQLite 不提供实际的十进制类型,所有类似 float 的数字都被转换为 double 。

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

对于小数 (10,5):

For conversions between TEXT and REAL storage classes, SQLite considers the conversion to be lossless and reversible if the first 15 significant decimal digits of the number are preserved. If the lossless conversion of TEXT to INTEGER or REAL is not possible then the value is stored using the TEXT storage class.

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

您的选择:

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

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

关于ios - 四舍五入问题将 NSDecimalNumber 插入到 Sqlite 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19861794/

相关文章:

ios - 无法添加iOS模拟器

java - 如何在 sqlite4java 中禁用自动提交?

WHERE 表达式中的 SQLite substr 函数

android - 我如何从另一个 Activity 更新数据库?

ios - 如何在 Swift 中检查 SQLite 表是否为空

iphone - iPhone 中的 IMEI 替换

ios - 取消UIScrollView拖动后弹跳

ios - 如何打开核心数据模型创建的sqlite文件以查看条目

ios - 使用 Xcode 将预加载的 sqlite 数据库添加到 iOS 应用程序后找不到表

iphone - SQLite。不能添加超过 1000 行