2017-06-05 89 views
0

我正在使用以下查詢;MySQL round()不按預期方式與sum()一起工作()

select round(sum(quantity * calories)) as calories 
from tableName; 

其中數量和卡路里類型的雙並分別具有值1.00 & 110.50。我期待的111的輸出,但上面的查詢,而不是給我110。但是,如果我執行像下面一個簡單的查詢,

select round (110.50); 

它給了我111作爲輸出。我經歷了這個Link,並使用瞭如下的查詢;

select round(sum(cast(quantity * calories as char))) as calories 
from tableName; 

但這一個也不適合我,給110輸出。有人可以告訴如何達到111的理想輸出嗎?

+0

是否正在施加在單個記錄或整個表這個查詢?你能否給我們提供樣本數據以顯示一些背景? –

+0

是的,我正在將它應用於單個記錄。 – karthi

+1

已知浮點運算在編程語言(包括MySQL)中並不準確。我的猜測是,有輕微的變化,導致整輪下降,而不是。我不會因此而失眠;如果你有一個真正的桌子,並且遇到嚴重的舍入問題,那麼更新你的問題。 –

回答

1

當你使用浮點數計算,最好是使用十進制(M,d)數據類型,而不是浮點/雙精度既是float和double表示近似數值數據值與計算結合使用時容易出現舍入誤差。

爲您查詢,您可以使用:

select round(cast(sum(quantity * calories) as decimal(8,1))) as calories 
from tableName; 
+0

它給了我正確的輸出,但是你能解釋一下小數(8,1)究竟是做什麼的。 – karthi

+0

從此[鏈接]開始瞭解十進制(M,D)(https://stackoverflow.com/questions/1818046/what-does-m-d-mean-in-decimalm-d-exactly/1818057)。我認爲這個解決方案很好。 – karthi

1

TRY :::

SELECT ROUND (CAST (SUM (quantity * calories) AS DECIMAL(10,4))) AS calories 
FROM tableName; 
+0

它給我一個語法錯誤。 – karthi

+0

@ karthi,請參閱編輯後的答案。應該這樣做。 (y) – PrinceKayastha

+0

這與@ slaakso的解決方案類似。謝謝你的幫助。 – karthi

1

您可以先鑄造參數DECIMAL做到這一點。然後我們以DECIMAL的形式執行SUM/ROUND操作。

SELECT round(sum( 
    CAST(quantity AS DECIMAL(10,4)) * 
    CAST(calories AS DECIMAL(10,4)))) AS calories 
FROM tableName; 

樣品

mysql> SELECT * FROM tableName; 

+----+----------+----------+ 
| id | quantity | calories | 
+----+----------+----------+ 
| 1 |  1 | 110.5 | 
+----+----------+----------+ 
1 row in set (0,02 sec) 

mysql> SELECT round(sum(
    ->  CAST(quantity AS DECIMAL(10,4)) * 
    ->  CAST(calories AS DECIMAL(10,4)))) AS calories 
    -> FROM tableName; 
+----------+ 
| calories | 
+----------+ 
|  111 | 
+----------+ 
1 row in set (0,00 sec) 

mysql> 

樣品2與DECIMAL(10,2)

mysql> SHOW CREATE TABLE tableName\G 
*************************** 1. row *************************** 
     Table: tableName 
Create Table: CREATE TABLE `tableName` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `quantity` decimal(10,1) DEFAULT NULL, 
    `calories` decimal(10,2) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 
1 row in set (0,00 sec) 

mysql> SELECT * from tableName; 
+----+----------+----------+ 
| id | quantity | calories | 
+----+----------+----------+ 
| 1 |  1.0 | 110.50 | 
+----+----------+----------+ 
1 row in set (0,00 sec) 

mysql> select round(sum(quantity * calories)) as calories 
    -> from tableName; 
+----------+ 
| calories | 
+----------+ 
|  111 | 
+----------+ 
1 row in set (0,00 sec) 

mysql> 
+0

它給我所需的輸出,但我有疑問。數量和卡路里的數據類型已經是十進制(10,2),爲什麼我們需要再次將它轉換爲十進制。請解釋一下 – karthi

+0

你寫道:「數量和卡路里都是**雙**」。現在你寫下它的小數(2,2)。 **十進制(2,2)**不能存儲您的值。精確的「定點」號碼。 M是總位數(精度),D是小數點後的位數(標度)。請參閱:https://mariadb.com/kb/en/mariadb/decimal/。我downvote –

+0

對不起,這是我的錯誤。數量和卡路里僅爲雙(10,2)類型。你的回答有點類似於@slaakso所提供的,只有演員的人數不同感謝你的幫助。 – karthi