一尘不染

实型值比较不正确

sql

REAL在db中有类型的字段。我使用PostgreSQL。和查询

SELECT * FROM my_table WHERE my_field = 0.15

不返回行中的值my_field0.15

但是例如查询

SELECT * FROM my_table WHERE my_field > 0.15

正常工作。

如何解决此问题并获取行my_field = 0.15


阅读 148

收藏
2021-05-23

共1个答案

一尘不染

解决 您的问题,请改用数据类型numeric ,该数据类型不是浮点类型,而是任意精度类型。

如果将数字文字
输入0.15numeric(相同的单词,不同的含义)列中,则会存储 确切的 数量-
与arealfloat8column列不同,在该列中,值被强制为下一个可能的二进制近似值。这可能是正确的,也可能不是确切的,具体取决于数量和实现的细节。十进制数字0.15恰好介于可能的二进制表示形式之间,并且以很小的错误存储。

请注意,计算结果本身可能是不精确的,因此=在这种情况下,请小心操作员。

这也取决于 如何 你测试。比较时,Postgres强制将各种数字类型转换为最能容纳结果的类型。考虑这个 演示

CREATE TABLE t(num_r real, num_n numeric);
INSERT INTO t VALUES (0.15, 0.15);

SELECT num_r, num_n  
      ,num_r = num_n       AS test1  --> FALSE!
      ,num_r = num_n::real AS test2  --> TRUE!
      ,num_r - num_n       AS result_nonzero  --> float8
      ,num_r - num_n::real AS result_zero     --> real
FROM  t;

SQL提琴。

因此,如果您已将0.15数字文字输入到数据类型的列中real,则可以使用以下命令找到所有此类行:

SELECT * FROM my_table WHERE my_field = **real '0.15'**

numeric如果需要精确存储小数位数,请使用列。

2021-05-23