我有我的項目中下面的代碼:Java的數學邏輯錯誤
int percent = 2;
int count = 10;
int percentagefill = (percent/10)*count;
System.out.println(percentagefill);
基本上正在發生的事情是,我設置了兩個變量,百分比和計數。然後我計算填充百分比。由於一些奇怪的原因,百分比填充導致0,在這種情況下,它應該是2.任何想法爲什麼?提前致謝。
我有我的項目中下面的代碼:Java的數學邏輯錯誤
int percent = 2;
int count = 10;
int percentagefill = (percent/10)*count;
System.out.println(percentagefill);
基本上正在發生的事情是,我設置了兩個變量,百分比和計數。然後我計算填充百分比。由於一些奇怪的原因,百分比填充導致0,在這種情況下,它應該是2.任何想法爲什麼?提前致謝。
int
除以int
仍然會導致int
。在這種情況下:
(percent/10)*count
= (2/10)*10
= (0) * 10 <-- 0.2 is rounded down to 0
= 0
您可以閱讀this question以供參考。另外,這裏是the Java spec其中是說整數除法舍入爲0.至於修復,只要floating point precision does not become an issue,只需使用double
,因爲PaulP.R.O說。
改變這一行:
int percentagefill = (percent/10)*count;
到:
double percentagefill = (percent/10.0)*count;
這將使用浮點運算(因爲10.0
而不是10),並且將結果存儲在一個double
(其具有精度超過小數點,不像int
)。
保羅,這是一個隱含的轉換爲不同的數據類型。更明確的數據類型轉換將更合適。 http://www.roseindia.net/java/beginners/TypeCasting.shtml – 2012-04-23 20:12:27
@ChrisK我沒有看到任何類型的促銷錯誤... – Paulpro 2012-04-23 20:20:56
您可以將其除以10.0
或將int percent
更改爲double percent
以強制轉換爲double
。否則,你會得到整數除法,它會截斷小數部分。
這裏有一個相關的問題:"Java Integer Division, How do you produce a double
?"
很容易解決:
int percent = 2;
int count = 10;
double percentagefill = (percent/10.0)*count;
System.out.println(percentagefill);
如果你真的需要的結果是一個int
,你可以做乘法除法之前,以避免整數師給你零。
int percentagefill = (percent*count)/10;
戴夫牛頓,你的答案應該是一個答案。 :)
整數2 /整數10 = 0 整數0 *整數10 = 0
您將需要一個浮動或雙data type。在處理信息的同時,對於解釋者進行數據類型假設和「鑄造」的機會總是會感到厭倦。 println需要一個intefer並將其轉換爲字符串以供顯示。
我的大部分工作是在php中,當使用值時,0,NULL,ERROR都可能是不同的東西,並可能產生意想不到的結果。有時您可能需要顯式地將變量轉換爲不同的數據類型才能獲得預期的結果。
正如其他人所說,你失去精度整數除法
的解決方案取決於你的需求:如果你的結果必須是整數反正乘第一:
int percentagefill = (percent*count)/10;
可能是「足夠好」給你(你會得到正確的答案)。
如果你需要能夠得到分數的答案,你需要的東西轉換成浮點類型:
double percentagefill = (percent/10.0)*count;
// ^the .0 makes this a double,
// forcing the division to be a
// floating-point operation.
之所以如此是由於事實,你當你應該使用整數數據類型使用浮點數據類型,如double。此代碼應導致2.0:
double percent = 2;
double count = 10;
double percentagefill = (percent/10)*count;
System.out.println(percentagefill);
因爲您正在使用整數除法和截斷精度。 – 2012-04-23 20:04:37
謝謝,我的替代品是什麼?我應該用雙重嗎? – progdoc 2012-04-23 20:06:00
「多久了?/這是布萊恩?」 - 我們似乎每週都會看到其中的幾個。人們在學習語言時不會閱讀文檔嗎? – duffymo 2012-04-23 20:06:20