2010-01-06 7 views
1

J'ai besoin d'une fonction mathématique/formule/expression pour prendre un nombre comme paramètre et trouver le nombre le plus bas se terminant par certains chiffres qui est plus grand que le paramètre.Comment "arrondir" un nombre à la fin de certains chiffres?

Par exemple, si les chiffres Ending devraient être 88 ce sont quelques exemples de ce que je veux:

f(0) = 0 
f(87) = 88 
f(88) = 88 
f(89) = 188 //NB: NOT 88*2=176 
f(187) = 188 
f(188) = 188 
f(189) = 288 

et ainsi de suite. Vous avez eu l'idée.

Jusqu'à présent, je l'ai utilisé une fonction (en Delphi, et non mis en œuvre par moi) qui fait cela:

function RoundToSpecificEndingDigits(aLength,aModMeasure : double) : double; 
begin 
    Result := aModMeasure; 
    while Result < aLength do Result := Result + 100; 
end; 

Maintenant, je besoin d'une approche plus « mathématique » avec divs et mods et tours etc. Le raison est que je veux le faire en SQL sans créer de fonctions.

+0

double: http://stackoverflow.com/questions/1555251/rounding-to-the-nearest-ending-digits – cjk

+0

@ck - pense que cette question fait référence à PHP , ici, nous avons affaire à Delphi ou peut-être SQL (@Svein, vous pourriez vouloir préciser lequel). –

+0

@Dominic - l'implémentation est en PHP, cependant la logique est universelle. – cjk

Répondre

1

que diriez-vous quelque chose comme ceci:

  1. compter le nombre de chiffres que vous voulez arrondir à « 88 » => n = 2
  2. Soustraire le suffixe de votre numéro.
  3. arrondir au 10^n le plus proche (diviser par 10^n, arrondir à l'entier, multiplier par 10^n)
  4. ajouter le suffixe.

Dans SQL:

SELECT 
    CEIL(
     (num - suffix)/POW(10, LENGTH(suffix)) 
    ) * POW(10, LENGTH(suffix)) + suffix