java简单但是很奇怪问题

来源:百度知道 编辑:UC知道 时间:2024/06/19 18:15:49
class Test
{
public static void main(String[] args)

{
double [] a ={0.1,1.2,8.9};
summe(a);

}
static void summe(double [] x)
{
double s=0;
int i=0;
while(i<x.length)
{
x[i]=2*x[i];
s=s+x[i];

i=i+1;

}
System.out.println(s);
}

}

结果是20.400000000000002
有人可以告诉我为什么吗

计算机存储小数和整数用的方法不一样。计算机表示数字和数学里也不一样。
数学里数据的大小是无限制的,数据的精度也是无限制的(如无理数)。
计算机使用固定大小的存储空间存储数据,那么数据的大小和精度都受到限制。
在整数上,是能够精确表达,但表达范围有限。
在小数上,表达范围有限,同时精度也有限。所以,小数到了一定的位数就是不准确的了。
而且,计算机表示小数用的也是二进制,而二进制小数与十进制小数多数情况下是无法精确转换的,所以你给的10进制的0.1,1.2,8.9到了计算机里就是二进制的,有了误差了,再运算,误差积累起来,就是你看到的结果了。

double型存储的变量是不精确的,后面的。。。。.2是随机的,正常结果,不同的机子可能后面的值是不一样的

计算机是很难精确的表示小数的
出现这样的结果属正常事件
不必在意
一般的
我们喜欢将小数化为整数来运算

Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。所以才会有BCD编码