首页 > 解决方案 > 为什么浮点值只能在 where 条件下作为文本找到

问题描述

如果没有引用参数,为什么找不到该行?

CREATE TABLE test (id integer, value real);
INSERT INTO test VALUES (1, 0.1);

不工作:

SELECT * FROM test where value = 0.1;
 id | value
----+-------
(0 rows)

作品!

SELECT * FROM test where value = '0.1';
 id | value
----+-------
  1 |   0.1
(1 row)

标签: sqlpostgresql

解决方案


您应该避免不精确的数据类型(如real

不精确意味着某些值无法精确转换为内部格式并存储为近似值,因此存储和检索值可能会显示出细微的差异。管理这些错误以及它们如何通过计算传播是整个数学和计算机科学分支的主题,这里将不讨论,除了以下几点:

  • 如果您需要精确的存储和计算(例如货币金额),请改用数字类型。

  • 如果你想用这些类型对任何重要的事情进行复杂的计算,特别是如果你依赖边界情况下的某些行为(无穷大、下溢),你应该仔细评估实现。

  • 比较两个浮点值是否相等可能并不总是按预期工作。

如果您坚持使用 real 确保两个参数具有相同的数据类型:

SELECT * FROM test where value = 0.1::real;

DBFiddle 演示


推荐阅读