2011-04-09 146 views
5

我是Java新手。我寫了下面的代碼:我的Java程序中「可能會損失精度」

import java.io.*; 
import java.lang.*; 

public class distravel 
{ 
    public static void main(String args[]) 
    { 
     String a1,a2,a3; 
     int x=2; 
     float d,u,a,t; 
     //d=distance travelled,u=initial velocity,a=acceleration,t=timeinterval 

     try 
     { 
      InputStreamReader read=new InputStreamReader(System.in); 
      BufferedReader buff=new BufferedReader(read); 

      System.out.print("Enter the INTIAL VELOCITY:"); 
      a1=buff.readLine(); 
      u=Float.parseFloat(a1); 
      System.out.print("Enter the ACCELERATION:"); 
      a2=buff.readLine(); 
      a=Float.parseFloat(a2); 
      System.out.print("Enter the TIME:"); 
      a3=buff.readLine(); 
      t=Float.parseFloat(a3); 

      d=((u*t)+a*Math.pow(t,x))/2F; 

      System.out.print("The total DISTANCE TRAVELLED:"+d); 
     } 
     catch(Exception e) 
     {} 
    } 
} 

我得到這個錯誤:

 
distravel.java28:possible loss of precision 
            found   :double 
            required  :float 
            d=((u*t)+a*Math.pow(t,x))/2F; 
                  ^

我怎樣才能解決這個問題?

+0

你能否正確地格式化你的問題? – Shankar 2011-04-09 06:11:35

+4

其中不包括SHOUTING。 – subsub 2011-04-09 06:13:30

回答

7
d=((u*t)+a*Math.pow(t,x))/2F; 

應該是

或聲明d作爲double作爲GrahamS建議。

+2

或者讓'd'一個'雙' – GrahamS 2011-04-09 06:16:05

+0

@GrahamS:是的。你是對的。 – 2011-04-09 06:19:22

+0

TY爲答案,真的認可UR HELP – 2011-04-09 17:57:54

4

不要在你的浮點數學計算中使用浮點數,除非你有特定的原因(你不這樣做)。首選類型的開銷是雙倍,不會高得多,並且精度的好處很大。

3

Math.pow返回double,所以你必須爲'd'加倍。或者你也可以投D'浮動。

2

這是因爲Math.pow()返回一個雙精度值,然後用它進行一些計算。不管你做什麼計算,你所要處理的精度都是雙倍的。 因此,您收到錯誤消息。 解決方案:
1)使浮點數加倍
2)將結果轉換爲float:d =(float)((u * t)+ a * Math.pow(t,x))/ 2F;

0

,因爲你聲明的變量float意味着它需要多達四個字節的隨機存取存儲器空間,它不能夠存儲在RAM中的所有數據,所以你必須聲明變量爲double那麼它會工作。