【发布时间】:2019-11-17 15:37:13
【问题描述】:
我试图了解在 SQLITE3 中处理与浮点数比较的最佳方法。一般来说,我知道测试浮点数是否相等是一种不好的做法。但是,我不确定如何在 SQLITE 关系数据库中执行此操作。
对表中的行使用 UNIQUE 约束(根据定义)是测试相等性。那么,在使用 REAL 数据类型时,这是一种不好的做法吗?
如果我想选择那个唯一的行,只知道 REAL 值,我应该怎么做?
我在 SQLITE3 中有下表:
CREATE TABLE nodes(
node_id INTEGER PRIMARY KEY,
node_number INTEGER,
x REAL,
y REAL,
z REAL,
UNIQUE(node_number, x, y, z)
);
对于表格插入,我执行以下操作:
INSERT OR IGNORE INTO
nodes(node_number, x, y, z)
VALUES
(?, ?, ?, ?);
要查找 node_id(用于后续插入),我执行以下操作:
SELECT
node_id
FROM
nodes
WHERE
node_number = ?
AND
x = ?
AND
y = ?
AND
z = ?;
【问题讨论】:
-
stackoverflow.com/a/23690512/7919597 你可以检查类似
(abs(a-b) >= 0.01) -
也许您可以定义一个自定义
https://docs.sqlalchemy.org/en/13/core/constraints.html#sqlalchemy.schema.UniqueConstraint并覆盖__eq__,但您必须询问 SQLAlchemy 专家。 -
您提供的链接中的一个建议是使用 DECIMAL 类型。但是,当我阅读 Sqlite 文档时,似乎 Sqlite 只是将其变成了 REAL,而其他数据库引擎的工作方式与 Python 的 Decimal 类类似。我想知道是否可以乘以所需的精度(10 ^ 9)并将其存储为整数?这一切对我来说似乎比它应该的更hack。
标签: python sql database sqlite data-structures