Adattato la risposta più popolare di Brann a MySQL per coloro che vengono come me.
CREATE FUNCTION `sfround`(num FLOAT, sf INT) # creates the function
RETURNS float # defines output type
DETERMINISTIC# given input, will return same output
BEGIN
DECLARE r FLOAT; # make a variable called r, defined as a float
IF(num IS NULL OR num = 0) THEN # ensure the number exists, and isn't 0
SET r = num; # if it is; leave alone
ELSE
SET r = ROUND(num, sf - 1 - FLOOR(LOG10(ABS(num))));
/* see below*/
END IF;
RETURN (r);
END
/* sentiva troppo lungo per mettere in commento */
ROUND (num, sf - 1 - PIANO (LOG10 (ABS (num))))
- La parte che funziona - utilizza la funzione ROUND sul numero come normale, ma la lunghezza da arrotondare viene calcolata
- ABS assicura positivo
- LOG10 ottiene il numero di cifre maggiore di 0 nel numero
- PIANO ottiene il più grande intero minore del numero risultante
- arrotonda Quindi, sempre verso il basso e dà un intero
- sf - 1 - PIANO (...) dà un numero negativo
opere perché ROUND (num, ve num) arrotonda alla sinistra del punto di
decimale per solo un una tantum, ROUND (123.456, -1) e Round (0.00123,4) restituire le risposte richiesti ((120, 0,0012)
fonte
2016-07-20 09:39:12
Che funziona bene, ed è molto più semplice di quello che mi è venuto in mente :-) – Paul
Anche se devi assicurarti che @number non sia 0. – Paul
in effetti; aggiornato di conseguenza. – Brann