sql - Oracle SQL - 圆形 - 一半

标签 sql oracle rounding

默认情况下,Oracle ROUND 函数会将“一半向上”四舍五入:

select 3.674 my_number,
       round(3.674,2) round_on_number
from   dual
union
select 3.675 my_number,
       round(3.675,2) round_on_number
from   dual
union
select 3.676 my_number,
       round(3.676,2) round_on_number
from   dual
;

 MY_NUMBER ROUND_ON_NUMBER
---------- ---------------
     3,674            3,67
     3,675            3,68
     3,676            3,68

我需要舍入“一半”,这基本上意味着我应该得到以下结果:
 MY_NUMBER EXPECTED_ROUND_ON_NUMBER
---------- ------------------------
     3,674                     3,67
     3,675                     3,67
     3,676                     3,68

它应该很快,因为我需要对数百万个项目执行此操作。

我可能会检测到数字是否以“5”结尾并在这种情况下截断最后一位数字,否则四舍五入,但我觉得这会效率低下(?)

谢谢 !
大卫

最佳答案

文档 shows you the algorithm used :

  1. If n is 0, then ROUND always returns 0 regardless of integer.
  2. If n is negative, then ROUND(n, integer) returns -ROUND(-n, integer).
  3. If n is positive, then
    ROUND(n, integer) = FLOOR(n * POWER(10, integer) + 0.5) * POWER(10, -integer)


所以你可以修改正的非零版本:
FLOOR(n * POWER(10, integer) + 0.4) * POWER(10, -integer)
                                 ^

例如对于固定舍入,暂时忽略零/负:
with t (my_number) as (
  select 3.674 from dual
  union all select 3.675 from dual
  union all select 3.676 from dual
)
select my_number,
  floor(my_number * power(10, 2) + 0.4) * power(10, -2) as round_on_number
from  t;

 MY_NUMBER ROUND_ON_NUMBER
---------- ---------------
     3.674            3.67
     3.675            3.67
     3.676            3.68

您可以通过 case 表达式包含零/负数;或者编写自己的函数来更巧妙地处理它。

关于sql - Oracle SQL - 圆形 - 一半,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48279641/

相关文章:

java - 在数据库中存储 JSP 标签

Java 四舍五入到最接近的 0.05

mysql - 表重复条目

mysql - Unix时间戳转换在Mysql和Oracle中是不同的

linux - oracle从plsql获取变量返回到linux

MySQL - 我怎样才能总是四舍五入小数?

javascript - 如何使用 JavaScript 舍入到任意数量的有效数字?

sql - 数据库错误-游标未从查询中返回

java - 使用 jdbc 将查询插入数据库时​​出错

mysql - 使用 ORDER BY 同时仍然保持使用索引