关于浮点数的存储及转换

#关于浮点数float的存储
浮点数是用于表示带有小数部分的数值。java中有两种浮点类型:float和double。
所有的浮点数值计算都遵循IEEE754规范。具体的说,有三种溢出和出错情况的特殊浮点数值:
1.正无穷大:一个 正整数除以0
2.负无穷大:一个负整数除以0
3.NaN:0/0或者负数的平方根。

float类型

float类型的数值后带有后缀f或F。没有后缀的浮点型默认是double类型。
float是单精度的,有四个字节(即32位),在内存中是以32位bit存储的。其中最高位代表正负值;后面8位代表阶位,表示的是数值的指数位,官方指定指数范围是-126~+127(除去全零和全一);最后23位是尾数,表示的是数值的有效位。如下图:
在这里插入图片描述
数值=(-1)^S **(1.M)*2^(E+127) ;所以float的取值范围大约是±3.402 823 47E+28F(有效位数为6~7位)

double类型

double类型的数值有后缀d或D(可以省略)。
double是双精度的,有八个字节(即64位),在内存中是以64位bit存储的。其中最高位代表正负值,后面11位代表阶位,表示的是数值的指数位,官方指定指数范围是-1022~+1023(除去全零和全一);最后52位是尾数,表示的是数值的有效位。如下图:
在这里插入图片描述
数值=(-1)^S **(1.M)*2^(E+1023) ;所以float的取值范围大约是±1.797 693 134 862 315 70E+308(有效位数为15位).。
在绝大部分应用程序中都采用double类型,因为在很多情况下,float类型的精度很难满足需求。事实上,只有很少数情况适用于使用float类型,列如,需要单精度数据的库,或是需要存储大量数据。
但是浮点数值不适用于无法接受舍入误差的金融计算中。列如:输入System.out.print(2.0-1.1);,最后输出的是0.899999999,而不是0.9。

浮点数类型的转换

float:因为float是四个字节的,所以虽然int类型(四个字节),long类型(八个字节)可以直接转换成float类型,但是在转换的过程中有可能会 丢失一些信息。
double:因为double是八个字节的,所以int类型(四个字节),float(四个字节)直接转换成double类型时不会丢失信息,而long类型(八个字节)在转换过程中有可能会丢失信息。
在Java中f浮点数也可以强制转换,但在转换过程中有可能会丢失。
像下面这些代码:

		int a=123456789;
		long l=-987654321123456789l;
		float f=a;
		double b1=a;
		double b2=l;
		System.out.println(f);
		System.out.println(b1);
		System.out.println(b2);

结果是:在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值