在oracle中以给定的精度舍入到最接近的偶数

时间:2017-11-07 10:20:36

标签: sql oracle rounding

我试图用与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);

3 个答案:

答案 0 :(得分:1)

  

我试图用与python相同的方式在oracle中舍入一个数字:到最近的偶数(达到给定的精度):

my answer here开始,你可以实现圆形的一半,即使:

SQL Fiddle

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 |

<强>然而

Python documentation州:

  

内置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;

db<>fiddle demo