2012-12-12 18 views
5

可能重複:我的程序的
How to iterate between 0.1f and 1.0f with 0.1f increments in Java?雙增量

部分需要使用while循環中值:

0.1

0.2

0.3

...

0.9

所以我需要爲他們提供的是內循環。 下面是代碼:

double x = 0.0; 
while (x<=1) 
{ 
// increment x by 0.1 for each iteration 
x += 0.1; 
} 

我需要的輸出被精確地:

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

但它實際上給了我這樣的:

0.1

0.2

0.300000000000000000000000004

0.4

0.5

0.6

0.79999999999999999999999999

0.89999999999999999999999999

0.99999999999999999999999999

+0

你似乎將正確的數字。我不明白爲什麼這不起作用。 – Mukus

+2

@TejaswiRana:它不工作,因爲0.1實際上是0.0999999999999999999999或0.10000000000000000001。小數部分不能用double來無損地表示。 – cHao

回答

10

歡迎浮點,其中0.1是不是0.1的世界。問題在於許多數字,包括0。1,不能完全代表double。所以你並不是真的每次在循環中加入0.1到x

一種方法是通過10使用整數運算和除法:

int i = 0; 
while (i <= 10) { 
    double x = i/10.0; 
    . . . 
    i++; 
} 

另一種方法是使x一個BigDecimal,在那裏你可以指定你想要一個特定的精度。它基本上是做上面的循環做的(一個整數加一個比例),但是打包在一個有很多花裏胡哨的好班級。哦,它有任意的精度。

+0

真的嗎?當你加0.1時,你實際上並沒有加0.1?這可以在很多直到日期存在的應用程序中進行大量的計算。 – Mukus

+0

@TejaswiRana:是的。這就是爲什麼'double'只是計算的一個好主意,可以容忍舍入誤差。遊戲物理計算?當然。錢?一定不行。基本上如果這個數字是一個*測量值*,雙打一般都是可以的;如果它是* count *,則改用BigDecimal或整數。 – cHao

+0

那麼,如果我正在創建一個銀行應用程序,我會用什麼作爲數據類型?浮動? – Mukus

1

使用BigDecimal

double x = 0.0; 
    int decimalPlaces = 2;   

    while (x<=1) 
    { 

    x += 0.1; 
    BigDecimal bd = new BigDecimal(x); 
    bd = bd.setScale(decimalPlaces, BigDecimal.ROUND_HALF_UP); 
    x = bd.doubleValue();   

    System.out.println(x); 
    } 
0

這是因爲您可以使用二進制浮點來執行精確的十進制算術,因爲FP無法精確地表示所有的十進制值。

您需要使用一個整數值來表示一些十進制小數單位,如百分之一或千分之一或使用類似BigDecimal的東西。

0

雙人被存儲在二進制

浮子存儲數字作爲一定數目的顯著數字和小數點(有點像科學記數法)。有意義的數字部分並不總是完美的,因爲它存儲爲一定數量的二進制數字 - 所以你不能指望它按照你期望的方式執行。 (對於一個更好的解釋看http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

考慮使用一個類如BigDecimal的或實現有理數類,喜歡這裏提到的那些 - Is there a commonly used rational numbers library in Java?

你也可以只把我變成一個整數,變化它從1到10,並在你的代碼中進行補償。

+0

開頭的句子有點令人誤解。每一個「雙」都是合理的價值;問題在於相反:並非每一個理性價值都是「雙重」價值。 –

+0

您也可以使用此處提供的代碼四捨五入爲一個有效數字。 http://stackoverflow.com/questions/202302/rounding-to-an-arbitrary-number-of-significant-digits – Shariq

+0

@TedHopp - 改變了我的答案;你是對的。我沒有解釋我理性的含義 - 我的意思是在記憶中,這個數字並不是分子與分母的比值。 – Shariq

1

要獲得您想要的輸出,您可以使用DecimalFormat。這裏是一些示例代碼。

import java.text.DecimalFormat; 

public class DF { 

    public static void main(String [] args) { 

    double x = 0.1; 
    DecimalFormat form = new DecimalFormat("#.#"); 
    while (x <= .9) { 
     System.out.println(Double.valueOf(form.format(x))); 
     x += 0.1; 
    } 

    } 

} 

就現在的實現而言,由於浮點數的性質而不能保證打印的精度。

1

您需要使用小數格式化程序來獲得預期的輸出。

下面是產生預期的輸出代碼:

import java.text.DecimalFormat; 


public class FloatIncrement { 

    public static void main (String args[]){ 

     double x= 0.0; 
     DecimalFormat form = new DecimalFormat("#.#");  
     while(x<0.9){ 
      x= x+0.1; 
      System.out.println("X : "+Double.valueOf(form.format(x)));   

     } 

    } 
} 
+0

這是一些很好看的代碼:) – squiguy

+0

@squiguy謝謝你的建議 – simbu94