为什么在SQLite中将1234567890.12345678插入十进制(18,8)列时会截断一些小数位?

时间:2013-12-30 04:46:24

标签: sqlite

下面是我在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且scale = 8,为什么有些小数位被截断?

1 个答案:

答案 0 :(得分:3)

有关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有其他信息,在处理浮点数时非常有用。