2016-05-17 4 views
1

で正常に動作しません:減算は、私のクエリ後SUM

SELECT SUM(t*q) as first, 
SUM(s*q) AS second, 
SUM(t*q)-SUM(s*q) AS firstminussecond 
FROM my_table 

結果は次のとおりです。

first = 9010.56 
second = 8664 
firstminussecond = 346.5599999999995 (this should be 346.56!) 

firstminussecondが正しくないのはなぜ?これを解決するには?あなたはROUND機能を使用する必要が

SELECT SUM(t*q) as first, 
SUM(s*q) AS second, 
FORMAT(SUM(t*q)-SUM(s*q),2) AS firstminussecond 
FROM my_table 
+0

'[q]、[s]、[t]'列のデータ型とは何ですか? – Stoleg

+1

浮動小数点演算の仕組みを読んでみることをお勧めします。表示されている結果は浮動小数点数と同じくらい正確です。 https://en.wikipedia.org/wiki/Floating_pointこの質問は、すべてのITおよびコンピュータサイエンス大学の学位プログラムの最終試験になるはずです。 –

答えて

0

私は私の意見では、正しい解決策を見つけ、私はINT(11)DECIMAL(10,2)qに列tsのデータ型を変更しました。今すぐfirstminussecondが正しいです。

+0

上記の計算が期待通りに行われなかった理由を知りましたか? – Stoleg

+0

はい、私はデータ型のためだと思います。 – Joy

+0

データタイプは計算にどのように影響しましたか? – Stoleg

1

は、

SELECT 
      ROUND(SUM(t*q),2) as first, 
      ROUND(SUM(s*q),2) AS second, 
      (
      ROUND(SUM(t*q),2)- 
      ROUND(SUM(s*q),2) 
      ) AS firstminussecond 
    FROM my_table 

OR

SELECT 
      ROUND(SUM(t*q),2) as first, 
      ROUND(SUM(s*q),2) AS second, 
      ROUND(
        (ROUND(SUM(t*q),2)- 
        ROUND(SUM(s*q),2)) 
       ,2) AS firstminussecond 
    FROM my_table 
2

これを試してくださいあなたはこれで試すことができます。

SELECT SUM(t*q) AS first, 
SUM(s*q) AS second, 
ROUND(SUM(t*q)-SUM(s*q), 2) AS firstminussecond 
FROM my_table 
2
SELECT SUM(t*q) as first, 
SUM(s*q) AS second, 
cast(SUM(t*q)-SUM(s*q) as decimal(5,2)) AS firstminussecond 
FROM my_table 
0

+0

これは正しい方法ですか? – Stoleg

+0

結果は '346.5599999999995'を小数点以下2桁に丸めます。' 346.56' – Matt

+0

'ROUND'を追加すると、別の計算になります。あなたはMySQLが減算を間違って実装していると言っていますか?どのように簡単な減算の回避策があれば誰でもそれに頼ることができますか? – Stoleg