Oracle 甲骨文圆半平

Oracle 甲骨文圆半平,oracle,Oracle,是否有任何Oracle函数来执行半轮偶数 我找到了这篇文章,但是我无法在Oracle中使用它 CREATE FUNCTION roundHalfEven (numberToRound IN NUMBER, roundPrecision IN NUMBER) RETURN NUMBER IS roundedNumber NUMBER; BEGIN DECLARE digitEvenOdd NUMBER; DECLARE digitPosition N

是否有任何Oracle函数来执行半轮偶数

我找到了这篇文章,但是我无法在Oracle中使用它

CREATE FUNCTION roundHalfEven (numberToRound IN NUMBER, roundPrecision IN NUMBER) 
   RETURN NUMBER 
   IS roundedNumber NUMBER;
   BEGIN 
      DECLARE digitEvenOdd NUMBER;
      DECLARE digitPosition NUMBER;
      DECLARE digitToRound NUMBER;
      DECLARE roundedNumber DECIMAL(20,6) DEFAULT 0;

      SET digitPosition = INSTR(numberToRound, '.');

      IF (roundingPrecision < 1) THEN
        SET digitPosition = digitPosition + roundingPrecision;
      ELSE
        SET digitPosition = digitPosition + roundingPrecision + 1;
      END IF;

      IF (digitPosition > 0 AND digitPosition <= CHAR_LENGTH(numberToRound)) THEN
        SET digitToRound = CAST(SUBSTR(numberToRound, digitPosition, 1) AS UNSIGNED);
        SET digitPosition = digitPosition - 1;

        IF (digitPosition > 0 AND digitPosition <= CHAR_LENGTH(numberToRound)) THEN
            SET digitEvenOdd = CAST(SUBSTR(numberToRound, digitPosition, 1) AS UNSIGNED);
        END IF;
      END IF;

      IF (digitToRound > -1) THEN
        IF (digitToRound >= 5 AND digitEvenOdd IN (1,3,5,7,9)) THEN
          SET roundedNumber = ROUND(numberToRound, roundingPrecision);
        ELSE
          SET roundedNumber = TRUNCATE(numberToRound, roundingPrecision);
        END IF;
      ELSE IF (roundingPrecision > 0) THEN
        SET roundedNumber = numberToRound;
      END IF;

      RETURN(roundedNumber); 
    END;
/
创建函数roundhalf偶数(numberToRound在数字中,roundPrecision在数字中)
返回号码
是舍入数;
开始
声明数字奇数;
申报数字位置号;
申报数码管号;
声明舍入数字十进制(20,6)默认为0;
设置数字位置=仪表(数字四舍五入');
如果(圆整精度<1),则
设置digitPosition=digitPosition+roundingPrecision;
其他的
设置digitPosition=digitPosition+roundingPrecision+1;
如果结束;
如果(digitPosition>0和digitPosition 0和digitPosition-1),则
如果(digitToRound>=5和(1,3,5,7,9)中的DigitVenOdd),则
设置roundedNumber=舍入(numberToRound,舍入精度);
其他的
设置roundedNumber=TRUNCATE(numberToRound,roundingPrecision);
如果结束;
否则,如果(舍入精度>0),则
设置roundedNumber=numberToRound;
如果结束;
返回(舍入编号);
结束;
/

Oracle 11g R2架构设置

CREATE TABLE test_data( value ) AS
SELECT (LEVEL -11)/2 FROM DUAL CONNECT BY LEVEL <= 21;
SELECT value,
       ROUND( value ),
       CASE 
       WHEN MOD( ABS( value ), 2 ) = 0.5
       THEN TRUNC( value )
       ELSE ROUND( value )
       END AS round_half_even
FROM   test_data
| VALUE | ROUND(VALUE) | ROUND_HALF_EVEN |
|-------|--------------|-----------------|
|    -5 |           -5 |              -5 |
|  -4.5 |           -5 |              -4 |
|    -4 |           -4 |              -4 |
|  -3.5 |           -4 |              -4 |
|    -3 |           -3 |              -3 |
|  -2.5 |           -3 |              -2 |
|    -2 |           -2 |              -2 |
|  -1.5 |           -2 |              -2 |
|    -1 |           -1 |              -1 |
|  -0.5 |           -1 |               0 |
|     0 |            0 |               0 |
|   0.5 |            1 |               0 |
|     1 |            1 |               1 |
|   1.5 |            2 |               2 |
|     2 |            2 |               2 |
|   2.5 |            3 |               2 |
|     3 |            3 |               3 |
|   3.5 |            4 |               4 |
|     4 |            4 |               4 |
|   4.5 |            5 |               4 |
|     5 |            5 |               5 |
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;
/
SELECT value,
       ROUND( value , 1),
       round_half_even( value, 1 )
FROM   test_data
| 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 |

CREATE TABLE test_data( value ) AS
SELECT (LEVEL -11)/2 FROM DUAL CONNECT BY LEVEL <= 21;
SELECT value,
       ROUND( value ),
       CASE 
       WHEN MOD( ABS( value ), 2 ) = 0.5
       THEN TRUNC( value )
       ELSE ROUND( value )
       END AS round_half_even
FROM   test_data
| VALUE | ROUND(VALUE) | ROUND_HALF_EVEN |
|-------|--------------|-----------------|
|    -5 |           -5 |              -5 |
|  -4.5 |           -5 |              -4 |
|    -4 |           -4 |              -4 |
|  -3.5 |           -4 |              -4 |
|    -3 |           -3 |              -3 |
|  -2.5 |           -3 |              -2 |
|    -2 |           -2 |              -2 |
|  -1.5 |           -2 |              -2 |
|    -1 |           -1 |              -1 |
|  -0.5 |           -1 |               0 |
|     0 |            0 |               0 |
|   0.5 |            1 |               0 |
|     1 |            1 |               1 |
|   1.5 |            2 |               2 |
|     2 |            2 |               2 |
|   2.5 |            3 |               2 |
|     3 |            3 |               3 |
|   3.5 |            4 |               4 |
|     4 |            4 |               4 |
|   4.5 |            5 |               4 |
|     5 |            5 |               5 |
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;
/
SELECT value,
       ROUND( value , 1),
       round_half_even( value, 1 )
FROM   test_data
| 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 |
或作为一种功能

CREATE TABLE test_data( value ) AS
SELECT (LEVEL -11)/2 FROM DUAL CONNECT BY LEVEL <= 21;
SELECT value,
       ROUND( value ),
       CASE 
       WHEN MOD( ABS( value ), 2 ) = 0.5
       THEN TRUNC( value )
       ELSE ROUND( value )
       END AS round_half_even
FROM   test_data
| VALUE | ROUND(VALUE) | ROUND_HALF_EVEN |
|-------|--------------|-----------------|
|    -5 |           -5 |              -5 |
|  -4.5 |           -5 |              -4 |
|    -4 |           -4 |              -4 |
|  -3.5 |           -4 |              -4 |
|    -3 |           -3 |              -3 |
|  -2.5 |           -3 |              -2 |
|    -2 |           -2 |              -2 |
|  -1.5 |           -2 |              -2 |
|    -1 |           -1 |              -1 |
|  -0.5 |           -1 |               0 |
|     0 |            0 |               0 |
|   0.5 |            1 |               0 |
|     1 |            1 |               1 |
|   1.5 |            2 |               2 |
|     2 |            2 |               2 |
|   2.5 |            3 |               2 |
|     3 |            3 |               3 |
|   3.5 |            4 |               4 |
|     4 |            4 |               4 |
|   4.5 |            5 |               4 |
|     5 |            5 |               5 |
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;
/
SELECT value,
       ROUND( value , 1),
       round_half_even( value, 1 )
FROM   test_data
| 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 |

Oracle 11g R2架构设置

CREATE TABLE test_data( value ) AS
SELECT (LEVEL -11)/2 FROM DUAL CONNECT BY LEVEL <= 21;
SELECT value,
       ROUND( value ),
       CASE 
       WHEN MOD( ABS( value ), 2 ) = 0.5
       THEN TRUNC( value )
       ELSE ROUND( value )
       END AS round_half_even
FROM   test_data
| VALUE | ROUND(VALUE) | ROUND_HALF_EVEN |
|-------|--------------|-----------------|
|    -5 |           -5 |              -5 |
|  -4.5 |           -5 |              -4 |
|    -4 |           -4 |              -4 |
|  -3.5 |           -4 |              -4 |
|    -3 |           -3 |              -3 |
|  -2.5 |           -3 |              -2 |
|    -2 |           -2 |              -2 |
|  -1.5 |           -2 |              -2 |
|    -1 |           -1 |              -1 |
|  -0.5 |           -1 |               0 |
|     0 |            0 |               0 |
|   0.5 |            1 |               0 |
|     1 |            1 |               1 |
|   1.5 |            2 |               2 |
|     2 |            2 |               2 |
|   2.5 |            3 |               2 |
|     3 |            3 |               3 |
|   3.5 |            4 |               4 |
|     4 |            4 |               4 |
|   4.5 |            5 |               4 |
|     5 |            5 |               5 |
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;
/
SELECT value,
       ROUND( value , 1),
       round_half_even( value, 1 )
FROM   test_data
| 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 |

CREATE TABLE test_data( value ) AS
SELECT (LEVEL -11)/2 FROM DUAL CONNECT BY LEVEL <= 21;
SELECT value,
       ROUND( value ),
       CASE 
       WHEN MOD( ABS( value ), 2 ) = 0.5
       THEN TRUNC( value )
       ELSE ROUND( value )
       END AS round_half_even
FROM   test_data
| VALUE | ROUND(VALUE) | ROUND_HALF_EVEN |
|-------|--------------|-----------------|
|    -5 |           -5 |              -5 |
|  -4.5 |           -5 |              -4 |
|    -4 |           -4 |              -4 |
|  -3.5 |           -4 |              -4 |
|    -3 |           -3 |              -3 |
|  -2.5 |           -3 |              -2 |
|    -2 |           -2 |              -2 |
|  -1.5 |           -2 |              -2 |
|    -1 |           -1 |              -1 |
|  -0.5 |           -1 |               0 |
|     0 |            0 |               0 |
|   0.5 |            1 |               0 |
|     1 |            1 |               1 |
|   1.5 |            2 |               2 |
|     2 |            2 |               2 |
|   2.5 |            3 |               2 |
|     3 |            3 |               3 |
|   3.5 |            4 |               4 |
|     4 |            4 |               4 |
|   4.5 |            5 |               4 |
|     5 |            5 |               5 |
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;
/
SELECT value,
       ROUND( value , 1),
       round_half_even( value, 1 )
FROM   test_data
| 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 |

Oracle 11g R2架构设置

CREATE TABLE test_data( value ) AS
SELECT (LEVEL -11)/2 FROM DUAL CONNECT BY LEVEL <= 21;
SELECT value,
       ROUND( value ),
       CASE 
       WHEN MOD( ABS( value ), 2 ) = 0.5
       THEN TRUNC( value )
       ELSE ROUND( value )
       END AS round_half_even
FROM   test_data
| VALUE | ROUND(VALUE) | ROUND_HALF_EVEN |
|-------|--------------|-----------------|
|    -5 |           -5 |              -5 |
|  -4.5 |           -5 |              -4 |
|    -4 |           -4 |              -4 |
|  -3.5 |           -4 |              -4 |
|    -3 |           -3 |              -3 |
|  -2.5 |           -3 |              -2 |
|    -2 |           -2 |              -2 |
|  -1.5 |           -2 |              -2 |
|    -1 |           -1 |              -1 |
|  -0.5 |           -1 |               0 |
|     0 |            0 |               0 |
|   0.5 |            1 |               0 |
|     1 |            1 |               1 |
|   1.5 |            2 |               2 |
|     2 |            2 |               2 |
|   2.5 |            3 |               2 |
|     3 |            3 |               3 |
|   3.5 |            4 |               4 |
|     4 |            4 |               4 |
|   4.5 |            5 |               4 |
|     5 |            5 |               5 |
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;
/
SELECT value,
       ROUND( value , 1),
       round_half_even( value, 1 )
FROM   test_data
| 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 |

CREATE TABLE test_data( value ) AS
SELECT (LEVEL -11)/2 FROM DUAL CONNECT BY LEVEL <= 21;
SELECT value,
       ROUND( value ),
       CASE 
       WHEN MOD( ABS( value ), 2 ) = 0.5
       THEN TRUNC( value )
       ELSE ROUND( value )
       END AS round_half_even
FROM   test_data
| VALUE | ROUND(VALUE) | ROUND_HALF_EVEN |
|-------|--------------|-----------------|
|    -5 |           -5 |              -5 |
|  -4.5 |           -5 |              -4 |
|    -4 |           -4 |              -4 |
|  -3.5 |           -4 |              -4 |
|    -3 |           -3 |              -3 |
|  -2.5 |           -3 |              -2 |
|    -2 |           -2 |              -2 |
|  -1.5 |           -2 |              -2 |
|    -1 |           -1 |              -1 |
|  -0.5 |           -1 |               0 |
|     0 |            0 |               0 |
|   0.5 |            1 |               0 |
|     1 |            1 |               1 |
|   1.5 |            2 |               2 |
|     2 |            2 |               2 |
|   2.5 |            3 |               2 |
|     3 |            3 |               3 |
|   3.5 |            4 |               4 |
|     4 |            4 |               4 |
|   4.5 |            5 |               4 |
|     5 |            5 |               5 |
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;
/
SELECT value,
       ROUND( value , 1),
       round_half_even( value, 1 )
FROM   test_data
| 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 |
或作为一种功能

CREATE TABLE test_data( value ) AS
SELECT (LEVEL -11)/2 FROM DUAL CONNECT BY LEVEL <= 21;
SELECT value,
       ROUND( value ),
       CASE 
       WHEN MOD( ABS( value ), 2 ) = 0.5
       THEN TRUNC( value )
       ELSE ROUND( value )
       END AS round_half_even
FROM   test_data
| VALUE | ROUND(VALUE) | ROUND_HALF_EVEN |
|-------|--------------|-----------------|
|    -5 |           -5 |              -5 |
|  -4.5 |           -5 |              -4 |
|    -4 |           -4 |              -4 |
|  -3.5 |           -4 |              -4 |
|    -3 |           -3 |              -3 |
|  -2.5 |           -3 |              -2 |
|    -2 |           -2 |              -2 |
|  -1.5 |           -2 |              -2 |
|    -1 |           -1 |              -1 |
|  -0.5 |           -1 |               0 |
|     0 |            0 |               0 |
|   0.5 |            1 |               0 |
|     1 |            1 |               1 |
|   1.5 |            2 |               2 |
|     2 |            2 |               2 |
|   2.5 |            3 |               2 |
|     3 |            3 |               3 |
|   3.5 |            4 |               4 |
|     4 |            4 |               4 |
|   4.5 |            5 |               4 |
|     5 |            5 |               5 |
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;
/
SELECT value,
       ROUND( value , 1),
       round_half_even( value, 1 )
FROM   test_data
| 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 |

Oracle 11g R2架构设置

CREATE TABLE test_data( value ) AS
SELECT (LEVEL -11)/2 FROM DUAL CONNECT BY LEVEL <= 21;
SELECT value,
       ROUND( value ),
       CASE 
       WHEN MOD( ABS( value ), 2 ) = 0.5
       THEN TRUNC( value )
       ELSE ROUND( value )
       END AS round_half_even
FROM   test_data
| VALUE | ROUND(VALUE) | ROUND_HALF_EVEN |
|-------|--------------|-----------------|
|    -5 |           -5 |              -5 |
|  -4.5 |           -5 |              -4 |
|    -4 |           -4 |              -4 |
|  -3.5 |           -4 |              -4 |
|    -3 |           -3 |              -3 |
|  -2.5 |           -3 |              -2 |
|    -2 |           -2 |              -2 |
|  -1.5 |           -2 |              -2 |
|    -1 |           -1 |              -1 |
|  -0.5 |           -1 |               0 |
|     0 |            0 |               0 |
|   0.5 |            1 |               0 |
|     1 |            1 |               1 |
|   1.5 |            2 |               2 |
|     2 |            2 |               2 |
|   2.5 |            3 |               2 |
|     3 |            3 |               3 |
|   3.5 |            4 |               4 |
|     4 |            4 |               4 |
|   4.5 |            5 |               4 |
|     5 |            5 |               5 |
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;
/
SELECT value,
       ROUND( value , 1),
       round_half_even( value, 1 )
FROM   test_data
| 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 |

CREATE TABLE test_data( value ) AS
SELECT (LEVEL -11)/2 FROM DUAL CONNECT BY LEVEL <= 21;
SELECT value,
       ROUND( value ),
       CASE 
       WHEN MOD( ABS( value ), 2 ) = 0.5
       THEN TRUNC( value )
       ELSE ROUND( value )
       END AS round_half_even
FROM   test_data
| VALUE | ROUND(VALUE) | ROUND_HALF_EVEN |
|-------|--------------|-----------------|
|    -5 |           -5 |              -5 |
|  -4.5 |           -5 |              -4 |
|    -4 |           -4 |              -4 |
|  -3.5 |           -4 |              -4 |
|    -3 |           -3 |              -3 |
|  -2.5 |           -3 |              -2 |
|    -2 |           -2 |              -2 |
|  -1.5 |           -2 |              -2 |
|    -1 |           -1 |              -1 |
|  -0.5 |           -1 |               0 |
|     0 |            0 |               0 |
|   0.5 |            1 |               0 |
|     1 |            1 |               1 |
|   1.5 |            2 |               2 |
|     2 |            2 |               2 |
|   2.5 |            3 |               2 |
|     3 |            3 |               3 |
|   3.5 |            4 |               4 |
|     4 |            4 |               4 |
|   4.5 |            5 |               4 |
|     5 |            5 |               5 |
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;
/
SELECT value,
       ROUND( value , 1),
       round_half_even( value, 1 )
FROM   test_data
| 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 |

请回答您的问题,并根据这些数据添加一些内容和预期输出。请您的问题-不要在评论中发布代码或其他信息。还要添加您尝试的代码,这些代码“无法用于”您的问题-不要在评论中发布代码或其他信息。有一个链接,可以满足您的问题,并根据该数据添加一些内容和预期输出。请您的问题-不要在评论中发布代码或其他信息。还要添加您尝试的代码,这些代码“无法用于”您的问题-不要在评论中发布代码或其他信息。链接到