float和double取值范围

最近在复习的时候发现基础太薄弱,对于float和double虽然了解所占字节数,但不知道他们的取值范围是多少,这对参加大厂笔试题时是十分不利的

1.八种数据类型的分类如下:
第一类:整型 byte short int long

第二类:浮点型 float double

第三类:逻辑型 boolean(它只有两个值可取true false)

第四类:字符型 char

2.各种基本数据类型所占的字节:
boolean 布尔型                 1/8 
byte 字节类型                    1
char 字符型                       2  一个字符能存储一个中文汉字
short 短整型                     2
int 整数类型                      4
float 浮点类型(单精度)  4
long 长整形                      8
double 双精度类型(双精度)  8


3.整型各基本数据类型的取值范围:
因为1byte = 8Byte ,(例如将3byte转化为二进制为:0000 0011 ,切记第一位为符号位,即0代表+,1代表-,剩下的七位是数据位)

所以byte取值范围是:-2^7~2^7-1,即:-128~127(因为0也包括在内,所以在正数范围是2^7-1)

同理short取值范围:-2^15~2^15-1

int取值范围:-2^31~2^31-1(-2147483648~2147483647)约21亿

long取值范围:-2^63~2^63-1

4.float和double取值范围和精度问题:
float和double的范围是由指数的位数来决定的。float的指数位有8位,而double的指数位有11位,分布如下:

float:
1bit(符号位)

8bits(指数位)

23bits(尾数位)

double:

1bit(符号位)

11bits(指数位)

52bits(尾数位)

范围问题:
float的指数范围为-2^7~2^7-1(即-128~127),而double的指数范围为-2^10~2^10-1(即-1024~1023),并且指数位是补码的形式来划分的。其

中负指数决定了浮点数所能表达的绝对值最小的数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。

float的范围为-2^128 ~ +2^128(-3.40E+38 ~ +3.40E+38)

double的范围为-2^1024 ~ +2^1024(-1.79E+308 ~ +1.79E+308)

精度问题:

float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的

,故不能对精度造成影响

float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;

double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

--------------------- 
作者:兮川 
来源:CSDN 
原文:https://blog.csdn.net/zc_ad/article/details/53404087 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 15
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在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类型 ``` 需要注意的是,由于浮点数的精度问题,进行舍入或高精度运算可能会导致一定的误差,使用时需要根据具体情况选择合适的方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值