先看代码class OverloadDemo { double test(double a) {
System.out.println("double a: " + a);
return a*a;
}
}
public class Overload { public static void main(String args[]) {
OverloadDemo ob = new OverloadDemo();
double result;

result = ob.test(1.255);
System.out.println("result: " + result);
}
}
在eclipse中结果是double a: 1.255
result: 1.5750249999999997result显然不对,但想了好长时间没有结果,只能请教大家了,谢谢

解决方案 »

  1.   

    doiuble本身就是不精确的:
    建议看看:
    http://topic.csdn.net/u/20090303/23/db895255-c0e0-4f14-8f26-9856bc7bcd19.html
      

  2.   

    实数的表示方法   1.科学计数法(scientific notation)     科学计数法是为了表示绝对值非常大的或非常小的实数时,所引入的一种方法。例如对于十进制实数+0.0000 0001而言,其相应的科学计数法表达形式为+1×10^-8;对于十进制实数-230000而言,其相应的表达形式为-2.3× 105;对于二进制实数+10.001而言,其相应的科学计数法表达形式为:+1.0001×21;对于16进制实数-ff.2ea3而言,其相应的科学计数法表达方式为-f.f2ea3×161。     一般来说,一个n进制实数对应的科学计数法表达形式由四个部分组成,分别是系数(coefficient),基数(base),指数和表示正负的符号。系数是介于表示正负的符号与乘号之间的实数,系数中的每个数字大于等于零,小于n,而且系数中小数点之前的数字只有一个,且不可以为0;基数是乘号后的指数式的底数,基数是等于n的;指数是乘号后的指数式的指数;表示正负的符号。     2.IEEE 浮点数标准(IEEE floating number standard)       1)电子与电气工程师协会(Institute of Electrical Electronics Engineers/IEEE)是一个非盈利的专业技术协会,它是计算机工程和通讯技术领域的权威。       2)在20世纪70年代之前,不同的计算机生产厂家对于实数的表示采用不同的形式,这使得许多程序对于不同的机器是不兼容的。在1980年,IEEE对于实数的浮点数表示方法进行了标准化,将实数的浮点数表示方法统一了起来。由于不同的应用领域对于数值的精度要求不同,IEEE给出了两种实数的浮点数表示方法,分别是单精度(single precision)浮点数表示方法和双精度(double precision)浮点数表示方法。       3)单精度浮点数(single precision floating number)           能力要求:当面对一个实数时,应能够将其转换为相应的单精度浮点数。           单精度浮点数表示方法使用32位来表示实数;31位是符号位(0表示正,1表示负);30位到23位这8位用于存放偏置指数(biased exponent);22位到0位这23位用于存放有效数字(significant)。           将十进制实数转化为单精度浮点数的步骤如下:           (1)首先将十进制实数转化为对应的二进制实数。           (2)将得到的二进制实数以类似于科学计数法的方法写出这样的形式+1.xxxxEyyyy。xxxx被称为有效数字,yyyy被称为指数。           (3)若为正,31位为0;若为负,31位为1.           (4)将指数加上十六进制数7F得到偏置指数,然后将所得结果放到30位到23位的右边,左边补0。           (5)将有效数字放到22位到0位的左边,右边补0。           请注意:有效数字是介于小数点和E之间的部分,并不是介于正负号和E之间的部分。           例题1:将十进制实数+9.75转化为单精度浮点数。             (1)十进制实数+9.75对应的二进制实数为+1001.11             (2)二进制实数+1001.11对应的科学计数法形式为+1.00111E11             (3)由于为正数,因此31位为0。             (4)偏置指数的十六进制形式为82,二进制形式为1000 0010.放到30位到23位的右边。             (5)将有效数字00111放到22位到0位的左边,右边补0.               最后得到的结果为:1 1000 0010  0011 1000 0000 0000 0000 000         练习题1:将十进制实数0.078125转化为单精度浮点数                     答案为:0011 1101 1010 0000 0000 0000 0000 0000       4)双精度浮点数(double-precision floating number)             双精度浮点数与单精度浮点数的不同之处在于:双精度浮点数使用64位来表示实数;63位是符号位(0表示正,1表示负);指数加上十六进制数3FF得到偏置指数,偏置指数放到62位到53位的右边,左边补0;有效数字放到52位到0位的左边,右边补0;           例题:将十进制实数152.1875转化为双精度浮点数 
    好好地读读上面的内容,上面的这段内容是我自己写的,里面写的很详细了,读明白了,你的问题也就解决了,记得当初我在解决这个问题时,查阅了大量的资料,在一般的书籍上是找不到相关的资料的,也可以说,在讲述C语言的书上是找不到相关资料的。原来上学时,老师讲得也是不明不白的,心里总是感觉不舒服,估计那老师也是搞不清楚的。这是为了授课准备的教案,自己看看吧。 
        产生误差的原因就在于有效数字的一部分由于空间的限制,被舍弃掉了。自己动手亲自来算一下,就会明白了。 
      

  3.   

    float,double都是这样的,你无法得到准确的结果
      

  4.   

    int a = (int)(1.255 * 1000);
    System.out.println((double)(a * a) / (1000D * 1000D));
      

  5.   

    java中的浮点数值是采用二进制系统表示的,在二进制系统中是无法表示比如像1/10这样的数,就想十进制中也无法精确表示1/3。如果在计算中要没有任何的误差,就使用java.math.BigDecimal类,它能够实现任意精度的浮点数运算。
    如: BigDecimal a =BigDecimal.valueOf(1.255);
     BigDecimal b=a.multiply(a);//a*a
     System.out.println(b);就是你要计算的值。只是在这种大数值中不能使用+ * 这些算术预算符。
      

  6.   

    很正常啊,double不准的,判断浮点型是否为0不是经常用a<1.0*10-12之类的,用它小于一个极小数,原理的话,楼上有个兄弟已经说了