To solve你的问题使用数据类型numeric https://www.postgresql.org/docs/current/datatype-numeric.html相反,它不是浮点类型,而是任意精度类型。
如果您输入数字文字 https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS-NUMERIC 0.15
into a numeric
(同一个词,不同的意思)列,exact金额被存储 - 与real
or float8
列,其中值被强制为下一个可能的二进制近似值。这可能准确,也可能不准确,具体取决于数量和实现细节。十进制数 0.15 恰好落在可能的二进制表示形式之间,并且存储时存在微小错误。
请注意,计算结果本身可能不准确,因此仍需警惕=
在这种情况下操作员。
这也取决于how你测试一下。比较时,Postgres 将不同的数字类型强制转换为最能保存结果的类型。
考虑一下这个demo:
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;
db<>fiddle
Old sqlfiddle http://www.sqlfiddle.com/#!17/9a5b9c/1
因此,如果您已输入0.15
作为数据类型列中的数字文字real
,您可以使用以下命令找到所有此类行:
SELECT * FROM my_table WHERE my_field = real '0.15'
Use numeric
如果您需要精确存储小数位,请使用列。