我是新來的Java,我想這樣做:Java新手:爲什麼不給我正確的結果?
System.out.println(1/20 * 1000);
這應輸出50,但由於某些原因,它輸出0
我通過鍵入
System.out.println((int) (1F/20F * 1000F));
固定它
(我知道你不需要int投影,但我只是想看看它是否工作)
爲什麼Java給了我這個奇怪的結果?
我是新來的Java,我想這樣做:Java新手:爲什麼不給我正確的結果?
System.out.println(1/20 * 1000);
這應輸出50,但由於某些原因,它輸出0
我通過鍵入
System.out.println((int) (1F/20F * 1000F));
固定它
(我知道你不需要int投影,但我只是想看看它是否工作)
爲什麼Java給了我這個奇怪的結果?
讓我們來分解它。您的代碼是有點像這樣:
int tmp1 = 1/20;
int tmp2 = tmp1 * 1000;
System.out.println(tmp2);
現在牢記的是,當兩個操作數是整數,該操作將使用整數算術執行。這意味着tmp1
爲0 ...這意味着tmp2
將爲0
你的第二個版本是不是等同於:
float tmp1 = 1F/20F; // Both values are of type "float" here
float tmp2 = tmp1 * 1000F;
int tmp3 = (int) tmp2;
System.out.println(tmp3);
現在tmp1
是大致 0.05,tmp2
是大致 50 ,tmp3
是50.值得注意的是,由於浮點運算的變幻莫測,我不會非常驚訝地得到49的值 - tmp1
不能是正好 0.05,因爲這不能表示爲float
。
一般來說,如果一個大的語句沒有達到你期望的值,那麼就有必要將它分解成更小的語句 - 讓你可以更輕鬆地一步一步地進行調試。
謝謝,非常好的解釋。 :) – user2102293 2013-03-20 18:47:08
由於Java正在執行integer division(JLS 15.17),其中1/20
爲0,小數部分被丟棄。
指定1F
是一個float
文字。在這種情況下,Java將按預期執行分割。
哇,我現在感覺有點愚蠢。謝謝你的幫助... – user2102293 2013-03-20 18:46:01
和http://stackoverflow.com/questions/7220681/division- java中的整數 – sharakan 2013-03-20 18:45:05