[Java]浮点数float、double取值范围与精度

1、Java浮点数

在Java中,浮点数取值范围的表示不像整数那么简单。对于int来说,他的规则标准是:一个int类型变量占32位,最高位为符号位,剩下31位表示值,所以取值范围 [-2^{31}, 2^{31}-1] 。而浮点数有另一套标准,IEEE 754

2、float结构

我们以float为例子,一个float数占4字节32位,分为三部分:符号位,指数位,尾数位。

符号位(S):1bit指数位(E):8bit尾数位(M):23bit
  1. 符号位:0表示正数,1表示负数;
  2. 指数位:格式为:2^{E-127},值范围\left [ 2^{-127}, \right 2^{128}]
  3. 尾数位:形式为1.M或0.M。其中当E=0时,取1.M,称为正规形式,当E!= 0时,取0.M,称为非正规形式。

3、取值范围

正规形式float值 = (-1)^{S}*2^{E-127}*(1.M),非正规形式float值 = (-1)^{S}*2^{-127}*(0.M)

根据上式,很容易就能计算出float取值范围\left (-2^{128}, \right 2^{128}),能取到区间内的近似值。float最小绝对值2^{(-126-23)} = 2^{-149}

除了正规与非正规形式,浮点数还包含多个特殊值,具体形式如下:

符号指数部分指数部分-127尾数部分

小数部分的

最高有效位

形式
1255128非0没有NaN
12551280没有负无穷
11~254-126~127任意1正规形式(负数)
10-127非00非正规形式(负数)
10-1270没有负0
00-1270没有正0
00-127非00非正规形式(正数)
01~254-126~127任意1非正规形式(负数)
02551280没有正无穷
0255128非0没有NaN

4.浮点数double

符号位(S):1bit指数位(E):11bit尾数为(M):52bit

浮点数double使用的规则和float相似,不过每个部分位数与float不同。正规double值 = (-1)^{S}*2^{E-1023}*(1.M)

5.精度

尾数代表的是2的负数次方,使用二进制的科学计数法近似表示十进制科学计数法。对于float来说,尾数最小值2^{-23}只能近似表示10^{-7},所以只能精确表示6~7位小数。对于double来说,尾数最小值2^{-52}只能近似表示10^{-16},只能精确表示15~16位小数。

 

参考:

https://blog.csdn.net/shenziheng1/article/details/79471340

https://blog.csdn.net/a327369238/article/details/52354811/#commentBox

https://baike.baidu.com/item/IEEE%20754/3869922?fromtitle=IEEE754标准&fromid=10427270

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,float类型的取值范围是-3.4028235E38到3.4028235E38,当赋给float类型的变量的值超出此范围时,可以采取以下几种解决办法: 1. 使用double类型:可以将超出float范围的值赋给double类型的变量。double类型的取值范围更大,为-1.7976931348623157E308到1.7976931348623157E308。 2. 舍入:使用Math类中的舍入方法,如Math.round()、Math.floor()、Math.ceil()等,将超出float范围的值舍入成合适的值。 3. 使用BigDecimal类:BigDecimal提供了高精度的十进制运算,可以用于处理超出float范围的值。首先将float类型的值转换为BigDecimal对象,然后进行运算或舍入操作,最后再将结果转换回float类型。 例如: ```java float f = 1.23E39f; double d = f; // 使用double类型来保存超出float范围的值 float roundedValue = Math.round(f); // 使用Math类中的round方法将值舍入 float flooredValue = (float) Math.floor(f); // 使用Math类中的floor方法向下舍入 float ceiledValue = (float) Math.ceil(f); // 使用Math类中的ceil方法向上舍入 BigDecimal bigDecimal = new BigDecimal(Float.toString(f)); // 将float转换为BigDecimal BigDecimal result = bigDecimal.add(new BigDecimal("100000000000000000000")); // 使用BigDecimal进行运算 float resultFloat = result.floatValue(); // 将BigDecimal转换回float类型 ``` 需要注意的是,由于浮点数精度问题,进行舍入或高精度运算可能会导致一定的误差,使用时需要根据具体情况选择合适的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值