2011-09-02 19 views
25

我在Java的一個非常簡單的除法(它每小時的產品數量/產量),但每當我做出這樣的劃分,我得到奇怪的錯誤:爲什麼整數除法碼給出了錯誤的答案?

float res = quantity/standard; 

我已經嘗試了上述部門與一些價值觀和我總是出現錯誤,但是,我試過其他地方,並得到了一個正確的,這是:

在世界各地:

13.6 = 6800/500; 

的Java:

13.0 = 6800/500; 

我研究BigDecimal和BigInteger的,但是我還沒有找到一種方法來創建這個師與他們沒有任何其他辦法可以做到這樣的劃分在Java中,而無需精度誤差?

任何幫助將不勝感激。

+8

「在世界各地」你不能重新分配文字;-)的價值,除非有使用'浮特定需要 –

+0

你應該使用'double' '。 – starblue

+3

「世界上任何地方」都不包括C,C++嗎? – djechlin

回答

71

您將整數分開,這意味着您正在使用整數除法

在整數除法中,結果的小數部分被丟棄。

嘗試以下方法:

float res = (float) quantity/standard; 
      ^^^^^^^ 

上述力的分子被視爲一個float從而促進分母浮動以及,並且執行代替一個int分浮子除法。

請注意,如果你處理的文字,你可以改變

float f = 6800/500; 

到包括f後綴,使分母的浮動:

float f = 6800f/500; 
      ^
+3

另一種常見方法是將分子或分母乘以1.0。順便說一下,幾乎沒有理由使用float而不是double,除非你真的關心保存4個字節。 –

+4

@Paul:所以沒有理由使用int而不是long,除非... [:-) –

+0

@Carlos,也許不是Java(實際上,我不知道),但是在C或C++中, int可以比long更快,但是由於「數學協處理器」(有些人記得這些是單獨的芯片時),雙打通常比浮點數快,因爲它們不必被下變換。 –

3

如果你關心我的精度會建議使用double,它的精度數位數增加了一倍以上。但是浮點數只能精確地表示0.5的和或0.5的冪。這意味着0.6只是近似代表。這不一定是適當舍入的問題。

double d = (double) 6800/500; 

double d = 6800.0/500; 
+0

雙精度和浮點精度之間是否存在性能差異?....我一直在進行一些輕量級讀取,並且我可能會對內存使用情況有點擔憂,軟件將要部署到的機器相當老舊 –

+0

double使用4個字節。如果內存非常緊張,可以使用'float',如果你有一百萬個,它可以節省4 MB。如果你沒有上百萬個這可能不值得擔心。 –

+1

那,機器不老 –

0

喜試試這個,它可以幫助FUL您的要求

double percent=(7819140000l-3805200000l)*100f/7819140000l; 
 

 
public String format_Decimal(double decimalNumber) { 
 
\t \t NumberFormat nf = NumberFormat.getInstance(); 
 
\t \t nf.setMaximumFractionDigits(5); 
 
\t \t nf.setMinimumFractionDigits(2); 
 
\t \t nf.setRoundingMode(RoundingMode.HALF_UP); 
 
\t \t String x = nf.format(decimalNumber); 
 
\t \t return x; 
 
\t }

0

在我來說,我這樣做:

double a = (double) (MAX_BANDWIDTH_SHARED_MB/(qCount+1)); 

取而代之的是「正確的」:

double a = (double)MAX_BANDWIDTH_SHARED_MB/(qCount+1); 
相關問題