我的Java程序中“可能会丢失精度”

时间:2011-04-09 06:09:53

标签: 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;
                                                            ^

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:7)

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

应该是

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

或将d声明为doubleGrahamS建议。

答案 1 :(得分:4)

不要在浮点数学计算中使用浮点数,除非你有特定的理由这样做(你没有)。首选类型的开销是双倍,并不高得多,准确性的好处也很大。

答案 2 :(得分:3)

Math.pow返回double,因此你必须为'd'加倍。或者你也可以将'd'投射到浮动状态。

答案 3 :(得分:2)

这是因为Math.pow()返回一个double,然后你用它做一些计算。 无论你做什么计算,你必须处理的精度是双倍的。 因此,您收到错误消息。 解决方案:
1)使浮子加倍 2)将结果转换为float:d =(float)((u * t)+ a * Math.pow(t,x))/ 2F;

答案 4 :(得分:0)

因为您将变量声明为float意味着它占用随机存取内存上的四个字节空间,因此无法将所有数据存储在ram中,因此您必须将变量声明为{{ 1}}然后就可以了。