如何用小数点执行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?
CEIL
和 FLOOR
return 最接近的 整数 并且不接受任何参数(但数字本身)。
因此,如果您想保留第一位小数,请先将数字乘以 10
、CEIL
/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
您可能需要查看负值以检查它们的行为是否与您相同 expect/want,并在必要时调整函数以模仿 round
。您还说小数点可能是零、一或更多;如果这可能是负面的,那么它将需要更多的工作...
在round 函数中我们可以使用(4,512,1) 但对于ceil 和floor 则不是这样。我想将 ceil 和 floor 的值 4,512 设为 4,5 和 4,6,但小数点 1 并不总是常数。它可能会有所不同。对于带小数点的 Floor,可以使用 trunc 函数。有没有办法用小数点执行ceil?
CEIL
和 FLOOR
return 最接近的 整数 并且不接受任何参数(但数字本身)。
因此,如果您想保留第一位小数,请先将数字乘以 10
、CEIL
/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 |
您可能需要查看负值以检查它们的行为是否与您相同 expect/want,并在必要时调整函数以模仿 round
。您还说小数点可能是零、一或更多;如果这可能是负面的,那么它将需要更多的工作...