2014-10-09 80 views
0

我遇到了java double數據類型的問題。問題是,在某些情況下,得到的結果是小數點後的數字非常大。在計算器上完成相同的計算,手動幾乎不能在小數點後達到2位數。我遇到了java雙數據類型問題

的代碼如下:

public class Calculater { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     String quantityInString="700g"; 
     int indexOfg=quantityInString.indexOf("g"); 
     String onlyQuantityInString=quantityInString.substring(0, indexOfg); 
     int onlyQuantityInInt=Integer.parseInt(onlyQuantityInString); 

     double perUnitCostOfThisItem=29.00; 
     double returnFloat=0; 
     returnFloat=(onlyQuantityInInt/(1000.00))*perUnitCostOfThisItem; 
     System.out.println("returnFloat="+returnFloat); 

    } 

} 

程序輸出是:使用計算器returnFloat=20.299999999999997

答案是20.3

我不知道爲什麼會這樣? 我已經在筆記本上運行的日食中嘗試過它,並且在Android手機 上也顯示相同的結果。

+2

您可能會遇到舍入錯誤。 – brso05 2014-10-09 14:00:53

+0

你的計算器不會比個人電腦或移動電話準確......所以它可能是四捨五入 – 2014-10-09 14:07:40

+0

沒有其實計算器是正確的Java程序有錯誤。 double和float不精確,你應該在我的答案下使用BigDecimal進行精確查找。 – brso05 2014-10-09 14:08:43

回答

0

如果你需要知道爲什麼這樣的模樣this

要格式化兩雙的行爲可以通過

String.format("%.2f", floatValue); 

注意:此格式它,直到2個地方做的原因。您也可以使用DecimalFormat。使用它的方法之一:

DecimalFormat df = new DecimalFormat(); 
df.setMaximumFractionDigits(2); 
System.out.println(df.format(decimalNumber)); 

另一個是使用#.##格式來構建它。

0

嘗試這種情況:

浮子最終值= Math.round(值* 100.0)/ 100.0;

0

請嘗試此操作以進行精確計算。 BigDecimal比雙精度更準確。

String quantityInString="700g"; 
    int indexOfg=quantityInString.indexOf("g"); 
    String onlyQuantityInString=quantityInString.substring(0, indexOfg); 
    BigDecimal onlyQuantityInInt= new BigDecimal(onlyQuantityInString); 

    BigDecimal perUnitCostOfThisItem= new BigDecimal("29.00"); 
    BigDecimal returnFloat= new BigDecimal(onlyQuantityInString); 
    returnFloat = returnFloat.divide(new BigDecimal("1000")); 
    returnFloat = returnFloat.multiply(perUnitCostOfThisItem); 
    System.out.println("returnFloat="+returnFloat); 

如果您需要精確計算,應使用BigDecimal而不是float和double。

此代碼的輸出爲:returnFloat = 20.300