【问题标题】:Why some decimal places truncated when insert 1234567890.12345678 into Decimal(18, 8) column in SQLite?为什么在 SQLite 的 Decimal(18, 8) 列中插入 1234567890.12345678 时会截断一些小数位?
【发布时间】:2013-12-30 13:05:43
【问题描述】:

下面是我在 SQLite 数据库中创建的表,

CREATE TABLE MyData(
  Code VARCHAR(20),
  Amount DECIMAL(18, 8)
);

然后我在表中插入 2 行。

INSERT INTO MyData
VALUES('A', 1.12345678);

INSERT INTO MyData 
VALUES('B', 1234567890.12345678);

之后,执行一条SELECT语句,

SELECT * FROM MyData;

SQLite 返回以下结果:

A|1.12345678
B|1234567890.12346

DECIMAL(18, 8) 假设表示精度=18,小数位数=8,为什么有些小数位会被截断?

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    sqlite 如何存储其数据的详细信息在here 中进行了描述。当您指定 DECIMAL 列类型时,该列的存储具有 NUMERIC 亲和性。

    2.0 节对类型亲和性有如下描述:

    具有 NUMERIC 亲和性的列可能包含使用所有五个的值 存储类。将文本数据插入 NUMERIC 列时, 文本的存储类转换为 INTEGER 或 REAL(按顺序 偏好)如果这种转换是无损和可逆的。为了 SQLite 认为 TEXT 和 REAL 存储类之间的转换 如果前 15 个转换为无损和可逆的 保留数字的有效十进制数字。如果 TEXT 到 INTEGER 或 REAL 的无损转换是不可能的 该值使用 TEXT 存储类存储。没有尝试 转换 NULL 或 BLOB 值。

    这表示sqlite会尝试类型之间的转换,如果数字的前15位可以转换和反转,则认为数字相等。这有效地限制了一个数字可以存储到 15 位有效数字的可用精度。

    wikipedia article on double precision floating point numbers 包含在处理浮点数时有用的附加信息。

    【讨论】:

      猜你喜欢
      • 2014-11-25
      • 2018-03-17
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多