浅谈java的浮点数精度问题及如何解决精度缺失问题

浅谈java的浮点数精度问题及如何解决精度缺失问题

ID:32904286

大小:53.00 KB

页数:10页

时间:2019-02-17

浅谈java的浮点数精度问题及如何解决精度缺失问题_第1页
浅谈java的浮点数精度问题及如何解决精度缺失问题_第2页
浅谈java的浮点数精度问题及如何解决精度缺失问题_第3页
浅谈java的浮点数精度问题及如何解决精度缺失问题_第4页
浅谈java的浮点数精度问题及如何解决精度缺失问题_第5页
资源描述:

《浅谈java的浮点数精度问题及如何解决精度缺失问题》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

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.Syste

2、m.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;doubled=f;doubl

3、ed2=20014999;System.out.println("f="+f);System.out.println("d="+d);System.out.println("d2="+d2);}}10/10得到的结果如下:f=2.0015E7d=2.0015E7d2=2.0014999E7从输出结果可以看出double可以正确的表示20014999,而float没有办法表示20014999,得到的只是一个近似值。这样的结果很让人讶异。20014999这么小的数字在float下没办法表示。于是带着这个问题,做了一次关于float和double学习,做个简单分享,希望有助于大家对java浮点数

4、的理解。 关于java的float和doubleJava语言支持两种基本的浮点类型:float和double。java的浮点类型都依据IEEE754标准。IEEE754定义了32位和64位双精度两种浮点二进制小数标准。IEEE754用科学记数法以底数为2的小数来表示浮点数。32位浮点数用1位表示数字的符号,用8位来表示指数,用23位来表示尾数,即小数部分。作为有符号整数的指数可以有正负之分。小数部分用二进制(底数2)小数来表示。对于64位双精度浮点数,用1位表示数字的符号,用11位表示指数,52位表示尾数。如下两个图来表示:float(32位):double(64位):10/10都是分为三

5、个部分:(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 = 8;  4.long l

6、 = 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.}  10/10publicclassFloatDoubleTest3{publicstaticvoidmain(String[]args){doubled=8;longl=Double.doubleToLongBit

7、s(d);System.out.println(Long.toBinaryString(l));floatf=8;inti=Float.floatToIntBits(f);System.out.println(Integer.toBinaryString(i));}}输出结果如下:Double:100000101110011000101100111100101110000000000000000000000000000F

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。