SQL中的自定义舍入逻辑关闭

时间:2016-07-06 08:34:54

标签: oracle

当第三个十进制数字大于5时,我希望将值舍入到小数点后2位:

<form action="/settings/create_car_service" accept-charset="UTF-8" data-remote="true" method="get">

我想在下面做

 39.956 should be round off to 39.96,
 35.665 should be round off to 35.66 ,
 39.997 should be round off to 40.00 ,
 56.684 should be round off to 56.68. 

但是对于边界情况,例如39.897和39.997,它不起作用。

2 个答案:

答案 0 :(得分:2)

也许你只需要这个:

SQL> with test(num) as (
  2      select 39.956 from dual union all
  3      select 35.665 from dual union all
  4      select 39.997 from dual union all
  5      select 56.684 from dual
  6  )
  7  select num, round(num -0.001, 2)
  8  from test;

       NUM ROUND(NUM-0.001,2)
---------- ------------------
    39,956              39,96
    35,665              35,66
    39,997                 40
    56,684              56,68

答案 1 :(得分:0)

Aleksej的解决方案可以正常工作,并且可能是最有效的如果事先知道输入数字最多有三位小数。

问题可以概括,如下:圆38.445下降到38.44;然而,回合38.44503至38.45。 (也就是说,如果在第三个小数位的“5”之后有非零数字,则向上舍入。)

在下面的查询可以在一般情况下使用。结果与“通常”舍入不同的唯一时间是输入数字恰好有三个非零小数位,第三个小数位数为5.这正是解决方案的读取方式。

with inp (n) as (select 38.445 from dual union all select 38.44503 from dual)
select n,
       round(n,2) - case when n = round(n, 3) and mod(1000*n, 10) = 5 
                         then 0.01 
                         else 0    end  as custom_rounded
from   inp;



         N CUSTOM_ROUNDED
---------- --------------
    38.445          38.44
  38.44503          38.45