Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL-第二轮-第二轮_Sql_Oracle_Rounding - Fatal编程技术网

Oracle SQL-第二轮-第二轮

Oracle SQL-第二轮-第二轮,sql,oracle,rounding,Sql,Oracle,Rounding,默认情况下,Oracle舍入函数舍入“半上”: 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

默认情况下,Oracle舍入函数舍入“半上”:

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”结尾,并在这种情况下计算最后一个数字,否则四舍五入,但我感觉这将是低效的(?)

谢谢大家!!
David

从值中敲出0.001,然后按正常方式四舍五入:

select round(my_number-.001,2)
from MyTable
要四舍五入到3dp,请更改为
-0.0001
,等文档:

  • 如果n为0,则舍入始终返回0,而与整数无关
  • 如果n为负,则舍入(n,整数)返回-ROUND(-n,整数)
  • 如果n为正,则
    ROUND(n,整数)=FLOOR(n*幂(10,整数)+0.5)*幂(10,-整数)
  • 因此,您可以修改正的非零版本:

    FLOOR(n * POWER(10, integer) + 0.4) * POWER(10, -integer)
                                     ^
    
    e、 g.对于固定舍入,现在忽略零/负:

    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
    

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

    因为没有内置函数可以做到这一点,所以不管怎样,最终都会得到类似于您所描述的东西。尽管如此,由于有数百万行,也许您可以简单地将它们全部四舍五入,然后只修复那些异常。这确实也是一个选项,尤其是四舍五入级别是固定的,永远不会更改(好吧,永远不应该更改)。谢谢嗨,亚历克斯,非常感谢你快速而有用的回答,我帮了我很多!嗨,约翰,谢谢你的回答,它也很好用,非常简单。我很可能会选择最复杂的,因为它看起来更接近于原始ROUND函数的实现方式。谢谢你@David-您应该比较两者的性能,特别是如果您将我的性能包装到函数中。(无论哪种方式,你都需要决定应该如何处理负值。)@AlexPoole有一个更稳健的方法。我的解决方案绝对是一个快速解决方案。实际上,我正在实现一个账单验证服务,“验证”是最终目标。首先,我需要对整个过程进行逆向工程。我做了,但我还没有做的一个“转换”是过程中的一个舍入。我首先需要了解使用什么舍入,然后在验证服务中对其进行编码。我认为“向下取整”是正确的,但当我在更多项目上实现解决方案时,我发现这并不完全正确。看来,尽管这里的答案质量很高,但我还是退了一步:-)需要更好地理解什么是舍入