2013-06-20 27 views
0

mlAnswer = (((degreesPLato->text().toInt() * 1000000) * 3800)/answer);QT回報數學不好

是quesition代碼 mlAnswer出來放-8223,而我的計算器拿出228000

調試輸出

12 * 1000000 * 3800/200000 = -8223

所有數據類型都ints請告訴我我做錯了什麼。

+3

有沒有聽說過整數溢出? –

+0

是的,我嘗試了很久很長的int並得到相同的結果 – Cjueden

+2

讓我猜...通過更改變量mlAnswer?那時已經太遲了。該公式從不根據其進入的數據類型進行評估。它在任何類型結束後都會被轉換爲該類型,只有在方程式已經被評估後才進行賦值。嘗試在1000000之後放置「LL」。 – darron

回答

5

12 * 1000000 * 3800 = 456億。

這超出了4字節有符號整數的範圍,這通常是int。請嘗試使用long long

整數常量的默認類型是int,除非該數字太大而不適合int。只要你在整數之間進行數學運算,結果保持爲整數。 12int1000000int,並且3800int。當你將它們相乘時,結果仍然是int,儘管它不再合適。添加LL後綴以使整數字面很長。即12LL1000000LL3800LL,等...

+0

我用long long int嘗試並得到相同的結果 – Cjueden

+0

@Cjueden:我們需要看一個完整的代碼示例,然後演示這個問題。 –

+0

是的,達倫剛剛說了什麼,加上'L',即'12L'應該夠了。 –

1

您可以通過重新安排你的行動解決這個問題:

12 * 1000000 * 3800/200000 

將溢出的int,但是:

12 * 1000000/200000 * 3800 

不會。

請注意,如果分子是分母的整數倍,這隻會給出相同的答案。在支持它的平臺上使用LL是一個更好的解決方案,但是如果限制爲4字節的int類型,則至少會在更多情況下停止溢出。