2010-07-08 46 views

Respuesta

35

Lo siguiente debería funcionar. Después de leer su pregunta, no estoy exactamente seguro de lo que quiere que devuelva 100. Por esta 100 declaraciones 100.

select floor((X + 99)/100) * 100; 

Esto da los siguientes resultados:

0 -> 0 
1 -> 100 
99 -> 100 
100 -> 100 
101 -> 200 
+0

Necesito algo si C# hace lo mismo, y la fórmula anterior funciona bien. El único pequeño problema es que no funciona si X es negativo. La forma en que lo arreglé (no del todo segura de la sintaxis de SQL, pero debería ser fácil de entender) fue asegurarme de que X siempre sea positiva (Abs (X)) y luego multiplicar por -100. –

+0

Lamento decirlo, pero esta respuesta solo parece funcionar para valores enteros. X = 100.25 todavía da 100 en lugar de redondear hasta 200. @ La respuesta del techo de Krock funciona mejor para carrozas y decimales – bmadtiger

14

Una opción sería utilizar la función CEILING() así:

SELECT CEILING(@value/100.0) * 100 

Es posible que deba convertir su valor a decimal primero según su tipo.

+0

Este es obviamente la mejor respuesta – ministry

+0

Esto no siempre redondea * ARRIBA *, como se especifica en la pregunta. Por ejemplo 'SELECT ROUND (129.0/100, 0) * 100' devuelve 100 en lugar de 200. – Gyromite

+0

@Gyromite extraño que el sitio web al que me he vinculado sea correcto, pero debo haberlo copiado incorrectamente:/ – krock

0

No hay una función nativa que lo haga, pero hay muchos trucos matemáticos simples que lo harán. Un ejemplo:

DECLARE @Foo int 
SET @Foo = 720 

print @Foo 
print (@Foo + 100) % 100 
PRINT @Foo - (@Foo + 100) % 100 
+0

Esto no siempre es redondo * ARRIBA *, como se especifica en la pregunta. Tu ejemplo con 720 ya que la entrada debería devolver 800, pero en cambio devuelve 700. – Gyromite

0

Usted puede utilizar este código, suponiendo que su amount es un int. Si no, tendrás que lanzar, para obtener una división entera.

If amount % 100 != 0 Then 
    roundedAmount = ((amount/100) * 100) + 100 
Else 
    roundedAmount = amount 

Es posible que desee empaquetar esto en un user defined function.

7

Utilice la función de techo para redondear una cifra de hasta

DECLARE @Number DECIMAL, @RoundUp DECIMAL 
SET @RoundUp = 100 
SET @Number = 720 
SELECT CEILING(@Number/@RoundUp)*@RoundUp 
17

para el redondeo al millar más cercano, por favor intente lo siguiente: -

select round(YourValue, -3) 

Saludos !!!!!

+0

Esto redondea hacia abajo, no hacia arriba. Intentalo. seleccionar ronda (1005, -3) --resultado: 1000 – Sameer

0

Una solución genérica: use MOD para encontrar el último lugar 100 y luego agregue 100 al resultado.

select (720 - MOD(720,100)) + 100 from dual; 

Si necesita el próximo lugar 80, simplemente reemplace cualquier "100" con "80".

+0

Hay un problema con esta fórmula cuando el valor de entrada ya es un múltiplo de 100. 'select (800 - (800% 100)) + 100;' dará 900 en lugar de 800. – Gyromite

3

Prueba esto:

seleccione redonda (@value, -2);

+0

Esto no siempre redondea * ARRIBA *, como se especifica en la pregunta. Por ejemplo 'select round (129.0, -2);' devuelve 100 en lugar de 200. – Gyromite

0

Es muy simple para redondear un número a cualquier múltiplo de 10 más cercano utilizando simplemente la función ROUND para excepto:

SELECT ROUND(number/1000,2)*1000 

Esto le dará el valor milésima más cercana.

0

Además de Gray's respuesta, que haría uso de la siguiente función en línea:

CREATE FUNCTION dbo.udf_RoundNearest 
(
@Number bigint, 
@RoundNearest bigint, 
@Direction int 
) 

RETURNS TABLE AS 
RETURN 

SELECT CASE WHEN @RoundNearest>[email protected] THEN @Number 
     ELSE 
     (
       (@Number + CASE 
          WHEN @Direction = 0 --Round Down 
          THEN 0 
          ELSE CASE WHEN @Number % @RoundNearest = 0 THEN 0 ELSE @RoundNearest END 
          END)/@RoundNearest) * @RoundNearest 

    END Number 

Parámetro Definición:

  1. @number - el número que necesita para redondear
  2. @RoundNearest 10º, 100º, 1000º, etc.
  3. @Dirección 0-> redondoabajo, 1-> redondeo por exceso

usando la función:

SELECT * FROM dbo.udf_RoundNearest (1965,100,1) --> 2000 
SELECT * FROM dbo.udf_RoundNearest (1359,100,0) --> 1300 
SELECT * FROM dbo.udf_RoundNearest (1999,10,0) --1990 
SELECT * FROM dbo.udf_RoundNearest (80,100,0) --> 80 (if the @number parameter is less or equal the @RoundNearest parameter the result will be the @number itself 

también se puede utilizar como aplicarlo contra una mesa tales como:

;with tmp (Value) as 
    (select 1236 union all select 6584 union all select 9999) 

    select t.*, fn.Number 
    from tmp t 
    cross apply dbo.udf_RoundNearest (Value,100,0) fn 

    /*Result Set 
    Value Number 
    1236 1200 
    6584 6500 
    9999 9900*/ 
Cuestiones relacionadas