Código: Selecionar todos
CREATE PROCEDURE `ze_troco`(
IN `nValorOriginal` DOUBLE(16,2)
)
BEGIN
DECLARE nValor DOUBLE(16,2);
SET @nTroco100 = 0;
SET @ntroco50 = 0;
SET @ntroco20 = 0;
SET @ntroco10 = 0;
SET @ntroco5 = 0;
SET @ntroco2 = 0;
SET @ntroco1 = 0;
SET @ntroco050 = 0;
SET @ntroco025 = 0;
SET @ntroco010 = 0;
SET @ntroco005 = 0;
SET @ntroco001 = 0;
SET nvalor = nvalororiginal;
if nvalor >= 100 then
SET @ntroco100 = FLOOR( nvalor / 100 );
SET nvalor = nvalor - ( 100 * @ntroco100 );
END if;
if nvalor >= 50 then
SET @ntroco50 = FLOOR( nvalor / 50 );
SET nvalor = nvalor - ( 50 * @ntroco50 );
END if;
if nvalor >= 20 then
SET @ntroco20 = FLOOR( nvalor / 20 );
SET nvalor = nvalor - ( 20 * @ntroco20 );
END if;
if nvalor >= 10 then
SET @ntroco10 = FLOOR( nvalor / 10 );
SET nvalor = nvalor - ( 10 * @ntroco10 );
END if;
if nvalor >= 5 then
SET @ntroco5 = FLOOR( nvalor / 5 );
SET nvalor = nvalor - ( 5 * @ntroco5 );
END if;
if nvalor >= 2 then
SET @ntroco2 = FLOOR( nvalor / 2 );
SET nvalor = nvalor - ( 2 * @ntroco2 );
END if;
if nvalor >= 1 then
SET @ntroco1 = FLOOR( nvalor / 1 );
SET nvalor = nvalor - ( @ntroco1 );
END if;
if nvalor >= 0.5 then
SET @ntroco050 = FLOOR( nvalor / 0.5 );
SET nvalor = nvalor - ( 0.5 * @ntroco050 );
END if;
if nvalor >= 0.25 then
SET @ntroco025 = FLOOR( nvalor / 0.25 );
SET nvalor = nvalor - ( 0.25 * @ntroco025 );
END if;
if nvalor >= 0.1 then
SET @ntroco010 = FLOOR( nvalor / 0.1 );
SET nvalor = nvalor - ( 0.1 * @ntroco010 );
END if;
if nvalor >= 0.05 then
SET @ntroco005 = FLOOR( nvalor / 0.05 );
SET nvalor = nvalor - ( 0.05 * @ntroco005 );
END if;
if nvalor >= 0.01 then
SET @ntroco001 = FLOOR( nvalor / 0.01 );
SET nvalor = nvalor - ( 0.01 * @ntroco001 );
END if;
SELECT * FROM (
SELECT 100 AS moeda, @ntroco100 AS qtd
UNION SELECT 50, @ntroco50
UNION select 20, @ntroco20
UNION SELECT 10, @ntroco10
UNION SELECT 5, @ntroco5
UNION SELECT 2, @ntroco2
UNION SELECT 1, @ntroco1
UNION SELECT 0.5, @ntroco050
UNION SELECT 0.25, @ntroco025
UNION SELECT 0.1, @ntroco010
UNION SELECT 0.05, @ntroco005
UNION SELECT 0.01, @ntroco001 ) AS X
WHERE qtd > 0
;
END
total 777.77
sem o erro de cálculo de ponto flutuante.
