2012-09-13 5 views
7

私はこの単純な関数を作ったが、結果は0.5ではなく1を返す。私のMySQL関数は、小数点を掛け合わせるときに数学精度を完全に失います。何故ですか?

どうしたのだろうか?

DELIMITER // 

DROP FUNCTION IF EXISTS test_decimal // 

CREATE FUNCTION test_decimal(input DECIMAL) 
    RETURNS DECIMAL 
BEGIN 
    SET @_credit = 0.5; 
    RETURN input * @_credit; 
END // 

DELIMITER ; 

SELECT test_decimal(1); 
+2

'@の_credit'は*だけでなくDECIMALとして*入力された場合はどうなりますか? (つまり、偶然に何か他のものとタイプすることができますか?) –

答えて

9

あなたはそれが値を丸めている理由だprecisionscaleを指定しなかったので。精度は値のために格納される有効桁数を表し、桁は小数点以下に格納できる桁数を表します。デフォルトでは、精度の値は10で、スケールの値は0です。したがって、RETURNS DECIMALRETURNS DECIMAL(10,0)と同じです。スケールが0の場合、のDECIMAL値に小数点または小数部は含まれません。 inを関数に指定してみてください。

RETURNS DECIMAL(5,2) -- 999.99 

DECIMAL, NUMERIC

SQLFiddle Sample

+0

非常に役に立ちます、ありがとう –

関連する問題