欢迎来到天天文库
浏览记录
ID:50907299
大小:42.00 KB
页数:10页
时间:2020-03-15
《浅谈java的浮点数精度问题及如何解决精度缺失问题.doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、javafloatdouble精度为什么会丢失?浅谈java的浮点数精度问题由于对float或double的使用不当,可能会出现精度丢失的问题。问题大概情况可以通过如下代码理解:[java] viewplaincopyprint?1.public class FloatDoubleTest { 2.public static void main(String[] args) { 3.float f = 20014999; 4.double d = f; 5.double d2 = 20014999; 6.System.out.println("f=" + f); 7.
2、System.out.println("d=" + d); 8.System.out.println("d2=" + d2); 9. System.out.println(0.05+0.01); System.out.println(1.0-0.42); System.out.println(4.015*100); System.out.println(123.3/100); 10.} 11.} publicclassFloatDoubleTest{publicstaticvoidmain(String[]args){floatf=20014999;doubl
3、ed=f;doubled2=20014999;System.out.println("f="+f);System.out.println("d="+d);System.out.println("d2="+d2);}}得到的结果如下:f=2.0015E7d=2.0015E7d2=2.0014999E7从输出结果可以看出double可以正确的表示20014999,而float没有办法表示20014999,得到的只是一个近似值。这样的结果很让人讶异。20014999这么小的数字在float下没办法表示。于是带着这个问题,做了一次关于float和double学习,做个简单分享,希望有助于
4、大家对java浮点数的理解。 关于java的float和doubleJava语言支持两种基本的浮点类型:float和double。java的浮点类型都依据IEEE754标准。IEEE754定义了32位和64位双精度两种浮点二进制小数标准。IEEE754用科学记数法以底数为2的小数来表示浮点数。32位浮点数用1位表示数字的符号,用8位来表示指数,用23位来表示尾数,即小数部分。作为有符号整数的指数可以有正负之分。小数部分用二进制(底数2)小数来表示。对于64位双精度浮点数,用1位表示数字的符号,用11位表示指数,52位表示尾数。如下两个图来表示:float(32位):double(
5、64位):都是分为三个部分:(1)一个单独的符号位s直接编码符号s。(2)k位的幂指数E,移码表示。(3)n位的小数,原码表示。那么20014999为什么用float没有办法正确表示?结合float和double的表示方法,通过分析20014999的二进制表示就可以知道答案了。以下程序可以得出20014999在double和float下的二进制表示方式。[java] viewplaincopyprint?1.public class FloatDoubleTest3 { 2.public static void main(String[] args) { 3.double d
6、 = 8; 4.long l = Double.doubleToLongBits(d); 5.System.out.println(Long.toBinaryString(l)); 6.float f = 8; 7.int i = Float.floatToIntBits(f); 8.System.out.println(Integer.toBinaryString(i)); 9.} 10.} publicclassFloatDoubleTest3{publicstaticvoidmain(String[]args){doubled=8;longl=Double.
7、doubleToLongBits(d);System.out.println(Long.toBinaryString(l));floatf=8;inti=Float.floatToIntBits(f);System.out.println(Integer.toBinaryString(i));}}输出结果如下:Double:100000101110011000101100111100101110000000000000000000000000000Float:1001011100
此文档下载收益归作者所有