如何用小数点执行oracle ceil

how to perform oracle ceil with decimal points

在round 函数中我们可以使用(4,512,1) 但对于ceil 和floor 则不是这样。我想将 ceil 和 floor 的值 4,512 设为 4,5 和 4,6,但小数点 1 并不总是常数。它可能会有所不同。对于带小数点的 Floor,可以使用 trunc 函数。有没有办法用小数点执行ceil?

CEILFLOOR return 最接近的 整数 并且不接受任何参数(但数字本身)。

因此,如果您想保留第一位小数,请先将数字乘以 10CEIL/FLOOR 该值,然后除以 10.

像这样:

SQL> with test (col) as (select 4.521 from dual)
  2  select col,
  3         --
  4         ceil(col * 10) / 10 c_ceil,
  5         floor(col * 10) / 10 c_floor
  6  from test;

       COL     C_CEIL    C_FLOOR
---------- ---------- ----------
     4,521        4,6        4,5

SQL>

调整 the round function 的定义方式(对于正数):

ROUND(n, integer) = FLOOR(n * POWER(10, integer) + 0.5) * POWER(10, -integer)

...对于可变上限的一般情况,您可能需要这样的东西:

ceil(n * power(10, integer)) * power(10, -integer)

因此您可以定义自己的函数:

create or replace function my_ceil(p_number number, p_decimals pls_integer)
return number as
begin
  return ceil(p_number * power(10, p_decimals)) * power(10, -p_decimals);
end;
/
create or replace function my_floor(p_number number, p_decimals pls_integer)
return number as
begin
  return floor(p_number * power(10, p_decimals)) * power(10, -p_decimals);
end;
/

然后是一些示例数据:

with t (n) as (
  select 4.512 from dual union all
  select 5.12345 from dual union all
  select 6 from dual union all
  select 0 from dual union all
  select -1.23 from dual
)
select n, 0 as d, my_ceil(n, 0) as my_ceil, my_floor(n, 0) as my_floor from t
union all
select n, 1 as d, my_ceil(n, 1), my_floor(n, 1) from t
union all
select n, 2 as d, my_ceil(n, 2), my_floor(n, 2) from t
union all
select n, 3 as d, my_ceil(n, 3), my_floor(n, 3) from t
union all
select n, 4 as d, my_ceil(n, 4), my_floor(n, 4) from t
order by n, d

你得到:

N D MY_CEIL MY_FLOOR
-1.23 0 -1 -2
-1.23 1 -1.2 -1.3
-1.23 2 -1.23 -1.23
-1.23 3 -1.23 -1.23
-1.23 4 -1.23 -1.23
0 0 0 0
0 1 0 0
0 2 0 0
0 3 0 0
0 4 0 0
4.512 0 5 4
4.512 1 4.6 4.5
4.512 2 4.52 4.51
4.512 3 4.512 4.512
4.512 4 4.512 4.512
5.12345 0 6 5
5.12345 1 5.2 5.1
5.12345 2 5.13 5.12
5.12345 3 5.124 5.123
5.12345 4 5.1235 5.1234
6 0 6 6
6 1 6 6
6 2 6 6
6 3 6 6
6 4 6 6

db<>fiddle

您可能需要查看负值以检查它们的行为是否与您相同 expect/want,并在必要时调整函数以模仿 round。您还说小数点可能是零、一或更多;如果这可能是负面的,那么它将需要更多的工作...