2012-02-13 3 views
4

SQLでラウンドを実行しようとしていますが、結果は非常に奇妙です。ここで私は何をすべきかです:SQLの丸めが必ずしも切り上げられない

私は私が選択していMSSQL

を使用しています:

Select num1, num2, num1 * num2, round(num1 * num2, 2) 
from myTable 

データ型:

NUM1がフロート

からnum2がAでありますお金

NUM1の値が15 あるとNUM2の値はここで0.033 である私の結果セットの場合:

15、0.033、0.495、0.5

私はそれらの値を持っているときに問題があります:

NUM1の値が5 あるとNUM2の値はここで0.045 ある場合は、私の結果セットです

5,0.045,0.225,0.22

誰かが考えていますか?

+1

MONEYデータ型を使用する必要がありますか?可能であれば、ここでは10進数に賛成して避けなければならない理由についての説得力のある記事があります:http://sqlserverpedia.com/blog/sql-server-bloggers/throw-your-money-away/ – David

+0

私は、私はsqlect:round(convert(decimal(10,3)、num2)* num1,2)でこれを試してみましたが、うまくいきませんでした:( – GregM

+0

興味深いのは私のために働いています。 CONVERT(小数点(10,3)、0.045)* 5,2)。「選択ラウンド(5 * 0.045、2)」でも正しい結果が得られます。 – David

答えて

0

私はフロートの列をお金に変換しました。

ありがとうございます!

+0

お金のデータ型を避ける必要があります。私は強く両方の値の範囲を検討し、代わりに適切な小数点を使用し、小数点以下の桁と精度のルールを理解し、小数点以下のペニーで何をすべきかについて適切な決定をすることを強くお勧めします。さらに、私が知る限り、スカラーを得るために分けるだけで、お金を得るために2つのお金の種類を掛け合わせることは絶対にありません。あなたはx * y $^2で終わるでしょう - 平方フィートや立方メートルのように、平方ドルのようなものはありません。 –

1

floatではなくlong型を使用できます。私はこれがフロートでの正確な問題だと思う。

+0

申し訳ありません私はmssqlを使用しています、私は私の質問を編集しました、 – GregM

+1

正確な数学が必要な場合はfloatを使用しないでください。小数の型を使用します。 – HLGEM

0

使用しているSQLのバージョンは?

は、フロートが近似でない実数である


DECLARE @num1 float 
DECLARE @num2 money 

SET @num1 = 15 
SET @num2 = 0.033 

SELECT 
@Num1, 
@Num2, 
@Num1 * @Num2, 
ROUND(@Num1 * @Num2,0), 
ROUND(@Num1 * @Num2,1), 
ROUND(@Num1 * @Num2,2), 
ROUND(@Num1 * @Num2,3) 

クエリアナライザでこのコードを試してみてください。代わりにDecimalを使用してください。


DECLARE @num1 decimal 
DECLARE @num2 money 

SET @num1 = 5 
SET @num2 = 0.045 

SELECT 
@Num1, 
@Num2, 
@Num1 * @Num2, 
ROUND(@Num1 * @Num2,2), 
ROUND(CAST(@Num1 as money) * @Num2,2) 
+0

申し訳ありませんが、私のラウンド関数で2を忘れましたが、これはここで結果がOKです:15 \t 0.033 \t 0.495 0.5 \t 0.5 \t 0.495;それは私の他のデータ、5と0.045私にトラブルを与える – GregM

5

あなたは(ノートがまた、そのテキストモードが異なります)グリッドビューモードでthis runnable exampleを見れば、あなたは問題が表示されます切り捨て数が実際0.224999999であることを

DECLARE @tbl AS TABLE (num1 float, num2 money); 
INSERT INTO @tbl VALUES (15, 0.033), (5, 0.045); 

Select num1, num2, num1 * num2, round(num1 * num2, 2) 
from @tbl; 

注意を、 .22 - あなたはSQL Serverの非バイナリ出力を見るときに注意する必要があります - あなたが期待していない方法で数字をテキストに変換することがあります。

これは、浮動小数点演算によるもので、結果として浮動小数点数が発生し、バイナリ表現の問題が発生します。

浮動小数点値の意味を考えて、小数点の代わりにlook at the rules for scale and precision for decimal operationsを使用することを検討してください。お金は小数点(19、4)とちょうど似ていることに注意してください。

関連する問題