我试图用与python相同的方式在oracle中舍入一个数字:到最近的偶数(达到给定的精度):
select round(2.5f) from dual -> 2
select round(2.5) from dual -> 3
Oracle可以通过在舍入为整数时将输入指定为float来执行此操作:
select round(0.3125f, 3) from dual -> 0.313 and not 0.312.
Any ideas?
可是:
$customer_info = array_merge((array)$country, (array)$info, (array)$reviews);
$cInfo_array = array_merge((array)$customers, (array)$customer_info);
答案 0 :(得分:1)
我试图用与python相同的方式在oracle中舍入一个数字:到最近的偶数(达到给定的精度):
从my answer here开始,你可以实现圆形的一半,即使:
Oracle 11g R2架构设置:
CREATE TABLE test_data( value ) AS
SELECT (LEVEL -11)/20 FROM DUAL CONNECT BY LEVEL <= 21
/
CREATE FUNCTION round_half_even(
value NUMBER,
prec INTEGER DEFAULT 0
) RETURN NUMBER
IS
whole NUMBER := POWER( 10, -prec );
BEGIN
RETURN CASE
WHEN ABS( MOD( value, 2*whole ) ) = 0.5*whole
THEN TRUNC( value, prec )
ELSE ROUND( value, prec )
END;
END;
/
查询1 :
SELECT value,
ROUND( value , 1),
round_half_even( value, 1 )
FROM test_data
<强> Results 强>:
| VALUE | ROUND(VALUE,1) | ROUND_HALF_EVEN(VALUE,1) |
|-------|----------------|--------------------------|
| -0.5 | -0.5 | -0.5 |
| -0.45 | -0.5 | -0.4 |
| -0.4 | -0.4 | -0.4 |
| -0.35 | -0.4 | -0.4 |
| -0.3 | -0.3 | -0.3 |
| -0.25 | -0.3 | -0.2 |
| -0.2 | -0.2 | -0.2 |
| -0.15 | -0.2 | -0.2 |
| -0.1 | -0.1 | -0.1 |
| -0.05 | -0.1 | 0 |
| 0 | 0 | 0 |
| 0.05 | 0.1 | 0 |
| 0.1 | 0.1 | 0.1 |
| 0.15 | 0.2 | 0.2 |
| 0.2 | 0.2 | 0.2 |
| 0.25 | 0.3 | 0.2 |
| 0.3 | 0.3 | 0.3 |
| 0.35 | 0.4 | 0.4 |
| 0.4 | 0.4 | 0.4 |
| 0.45 | 0.5 | 0.4 |
| 0.5 | 0.5 | 0.5 |
<强>然而强>
内置
round()
函数的文档说明了这一点 舍入到最接近的值,从零开始四舍五入。自从 小数分数2.675正好在2.67和2.68之间,你 可能期望这里的结果是(二进制近似)2.68。 它不是,因为当十进制字符串2.675
转换为a时 二进制浮点数,它再次被二进制替换 近似,其精确值为2.67499999999999982236431605997495353221893310546875
由于这个近似值略微接近2.67而不是2.68,因此 四舍五入。
因此,在Oracle中实现python的ROUND()
函数的方法是使用内置的ROUND()
函数,并且知道python的实现有轻微的舍入错误。 / p>
答案 1 :(得分:0)
DECODE ( SIGN(MOD((0.3127*10000),10)- 5),1,round(0.3125,3),round( floor(0.3125*1000)/1000,3) )
答案 2 :(得分:0)
Oracle支持ROUND_TIES_TO_EVEN (number):
SELECT ROUND(0.3125, 3) AS ROUND -- 0.313
,ROUND_TIES_TO_EVEN(0.3125, 3) AS ROUND_EVEN -- 0.312
FROM dual;