2016-05-17 22 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是不正確的?如何解決這個問題?

+0

列'[q],[s],[t]'的數據類型是什麼? – Stoleg

+1

我建議你閱讀浮點算法的工作原理 - 或者不使用它。所顯示的結果實際上與浮點允許的結果一樣準確。 https://en.wikipedia.org/wiki/Floating_point這個問題或其他類似問題應該在每門IT和計算機科學大學學位課程的期末考試中進行。 –

回答

0

我發現在我看來,正確的解決方案,我改變了列ts數據類型DECIMAL(10,2)qINT(11)。現在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, 
FORMAT(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

您需要使用ROUND功能。

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

它如何使上面的計算正確? – Stoleg

+0

它將結果'346.5599999999995'舍入爲小數點後兩位'346.56' – Matt

+0

添加'ROUND'使其成爲不同的計算結果。你是說MySQL不正確地執行減法嗎?當簡單的減法解決方法時,任何人都可以依賴它? – Stoleg