java 浮点数为什么精度会丢失

Python09

java 浮点数为什么精度会丢失,第1张

并不是java的浮点数精度会丢失,而是所有用二进制存储中的浮点数都可能会精度丢失(部分特殊的小数数值可以精确表示),所以计算机中存储的浮点数都存在精度丢失的风险,不过一边这个丢失的精度对我们正常的使用不会构成影响。

小数在转换为二进制时并不一定能用一个精确的二进制表示,大多数时候都是取的一个近似值,这就造成了精度的丢失。如果再用这个二进制进行计算,明显计算结果的精度会进一步丢失。

举个简单的例子把0.1用二进制表示(小数与二进制转换方法)

(1) 0.1 x 2 = 0.2  取整数位 0 得 0.0

(2) 0.2 x 2 = 0.4  取整数位 0 得 0.00

(3) 0.4 x 2 = 0.8  取整数位 0 得 0.000

(4) 0.8 x 2 = 1.6  取整数位 1 得 0.0001

(5) 0.6 x 2 = 0.2  取整数位 1 得 0.00011

(6) 0.2 x 2 = 0.4  取整数位 0 得 0.000110

(7) 0.4 x 2 = 0.8  取整数位 0 得 0.0001100

(8) 0.8 x 2 = 1.6  取整数位 1 得 0.00011001

(9) 0.6 x 2 = 1.2  取整数位 1 得 0.000110011

(n) ...

得到一个无限循环的二进制小数 0.000110011…,没办法用一个精确的二进制表示0.1。而且计算机中存储一个浮点数所用的位数也是有限的,所以只能选择在某一个精度进行保存。

当然也有特殊的小数,比如0.25的二进制为0.01

附:代码之谜(五)- 浮点数(谁偷了你的精度?)

主要有下面几个区别,手册上的,希望能帮到你

1、变量类型不同

float属于单精度型浮点数据。

double属于双精度型浮点数据。

2、指数范围不同

float的指数范围为-127~128。

double而double的指数范围为-1023~1024

3、表达式指数位不同

float的表达式为1bit(符号位)+8bits(指数位)+23bits(尾数位)

double的表达式为1bit(符号位)+ 11bits(指数位)+ 52bits(尾数位)

4、占用内存空间不同

float占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38。

double占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308。

5、有效位数不同

float只能提供七位有效数字。

double可提供16位有效数字。

float:4字节(32bit),IEEE 754. 取值范围:

[-3.40282346638528860e+38 , -1.40129846432481707e-45] ∪ [1.40129846432481707e-45 ~ 3.40282346638528860e+38] 。

double: 8字节(64bit) ,IEEE 754.  取值范围:

[-1.79769313486231570e+308,-4.94065645841246544e-324] ∪  [4.94065645841246544e-324,1.79769313486231570e+308] 。

扩展资料

基本数据类型的特点,位数,最大值和最小值。

1、

基本类型:short 二进制位数:16

包装类:java.lang.Short

最小值:Short.MIN_VALUE=-32768 (-2的15此方)

最大值:Short.MAX_VALUE=32767 (2的15次方-1)

2、

基本类型:int 二进制位数:32

包装类:java.lang.Integer

最小值:Integer.MIN_VALUE= -2147483648 (-2的31次方)

最大值:Integer.MAX_VALUE= 2147483647  (2的31次方-1)

3、

基本类型:long 二进制位数:64

包装类:java.lang.Long

最小值:Long.MIN_VALUE=-9223372036854775808 (-2的63次方)

最大值:Long.MAX_VALUE=9223372036854775807 (2的63次方-1)

4、

基本类型:float 二进制位数:32

包装类:java.lang.Float

最小值:Float.MIN_VALUE=1.4E-45 (2的-149次方)

最大值:Float.MAX_VALUE=3.4028235E38 (2的128次方-1)

5、

基本类型:double 二进制位数:64

包装类:java.lang.Double

最小值:Double.MIN_VALUE=4.9E-324 (2的-1074次方)

最大值:Double.MAX_VALUE=1.7976931348623157E308 (2的1024次方-1)

参考资料:Java官网-Java教程