如何通过尾数长度选择浮点值?

时间:2018-02-02 21:25:32

标签: postgresql select precision numerical-methods

我有一个双精度值的列。我试图只选择精度大于十分之一的那些(例如,24.13,1.347等)。

我知道我可以使用以下内容将float转换为字符串并基于字符串长度进行查询:

select * from schema.table where char_length(to_char(float_column, 'FM999999999D999999999')) > 3;

这将返回小数位数超过1的所有行如果该数字的整数部分是单个数字(例如,它将返回24.1)。

如何选择mitissa长度大于1的任何浮点值?

3 个答案:

答案 0 :(得分:1)

Use split_part():

with my_table(float_column) as (
values
(24.13::float), (1.347), (12345), (.1)
)

select float_column, split_part(float_column::text, '.', 2)
from my_table;

 float_column | split_part 
--------------+------------
        24.13 | 13
        1.347 | 347
        12345 | 
          0.1 | 1
(4 rows)

So your query may look like this:

select *
from my_table 
where length(split_part(float_column::text, '.', 2)) > 1;

 float_column 
--------------
        24.13
        1.347
(2 rows)    

答案 1 :(得分:0)

如果您将值存储为numeric(固定点与浮点),那么您可以这样做:

where floor(col * 100) <> floor(col * 10) * 10

不幸的是,有一些边缘情况,这个逻辑对浮点数不起作用,因为你可以得到像21.99999999997这样的东西。

答案 2 :(得分:0)

look for rounding errors:

where round(float_column,1) <> round(float_column,5)