mlAnswer = (((degreesPLato->text().toInt() * 1000000) * 3800)/answer);
QT回報數學不好
是quesition代碼 mlAnswer
出來放-8223,而我的計算器拿出228000
調試輸出
12 * 1000000 * 3800/200000 = -8223
所有數據類型都ints
請告訴我我做錯了什麼。
mlAnswer = (((degreesPLato->text().toInt() * 1000000) * 3800)/answer);
QT回報數學不好
是quesition代碼 mlAnswer
出來放-8223,而我的計算器拿出228000
調試輸出
12 * 1000000 * 3800/200000 = -8223
所有數據類型都ints
請告訴我我做錯了什麼。
12 * 1000000 * 3800 = 456億。
這超出了4字節有符號整數的範圍,這通常是int
。請嘗試使用long long
。
整數常量的默認類型是int
,除非該數字太大而不適合int
。只要你在整數之間進行數學運算,結果保持爲整數。 12
是int
,1000000
是int
,並且3800
是int
。當你將它們相乘時,結果仍然是int
,儘管它不再合適。添加LL
後綴以使整數字面很長。即12LL
,1000000LL
,3800LL
,等...
我用long long int嘗試並得到相同的結果 – Cjueden
@Cjueden:我們需要看一個完整的代碼示例,然後演示這個問題。 –
是的,達倫剛剛說了什麼,加上'L',即'12L'應該夠了。 –
您可以通過重新安排你的行動解決這個問題:
12 * 1000000 * 3800/200000
將溢出的int
,但是:
12 * 1000000/200000 * 3800
不會。
請注意,如果分子是分母的整數倍,這隻會給出相同的答案。在支持它的平臺上使用LL
是一個更好的解決方案,但是如果限制爲4字節的int
類型,則至少會在更多情況下停止溢出。
有沒有聽說過整數溢出? –
是的,我嘗試了很久很長的int並得到相同的結果 – Cjueden
讓我猜...通過更改變量mlAnswer?那時已經太遲了。該公式從不根據其進入的數據類型進行評估。它在任何類型結束後都會被轉換爲該類型,只有在方程式已經被評估後才進行賦值。嘗試在1000000之後放置「LL」。 – darron