为什么下面这个程序结果是这样的

来源:百度知道 编辑:UC知道 时间:2024/06/20 09:35:13
public class Example2_2
{ public static void main(String args[])
{ int c=2200;
long d=8000;
float f;
double g=123456789.123456789;
c=(int)d;
f=(float)g;
System.out.println("c= "+c);
System.out.println("d= "+d);
System.out.println("f= "+f);
System.out.println("g= "+g);
}
}

为什么f的值是1.23456792E8
g的值是1.2345678912345679E8
float的取值是10的-38次幂到10的38次幂 和 -10的38次幂到-10的-38次幂
double的取值比他还大 为什么这里的结果精度都损失了呢?
取值范围这么大 我认为结果都应该是123456789.123456789啊 。

在计算机硬件系统中,你无法表示一个10进制数字,因此都需要转换为二进制数表示。但是一个浮点数一般都无法表示为一个精确的小数,实型数据在计算机里保存的时候会产生误差,特别是小数点后位数很多时。
不同的计算机语言、不同的编译环境(软硬件环境,特别是编译器)下,对于这种双精度型转换成单精度型,在截取位数时会造成误差。
二进制的小数的表示:
2^(-1) + 2^(-2) + 2^(-3) + 2^(-4) + ...
= 0.5 + 0.25 + 0.125 + 0.0625 + ...
可以看出,它所能精确表示的十进制数是有限的,在类型隐式转换截取位数时会按类型所能表示的长度把之后的位数舍去。

对提问者再提醒一下,在以后的编程中特别要注意,浮点数由于精度的问题,在大部分情况下都不适于进行精确比较(虽然这句话和本题提问没什么联系)。如果为了要精确计算,编程中有“大整数编程”和“高精度编程”。

修改再补充一句,学习编程去csdn多逛逛。