文档章节

Java中关于为什么long能自动转换成float类型的疑问解决

H
 Henrykin
发布于 2017/08/31 08:45
字数 1019
阅读 81
收藏 0

最为一个常识,我们都知道浮点型在内存中占用的是4个字节的空间,而long型占用的是8个字节的空间。可是为什么4个字节的float型的最大值会大于long型的最大值呢?
  我们都知道,float类型的范围是:一3.403E38~3.403E38。而long类型的范围是:-2^63~2^63-1(大概是9*10^18)。
  我以前也是简单的记住就算完事了,对于它为什么会这样却没有考虑过。
  下面给大家分享一下我现在的理解:
  long整型数,在内存中占用8个字节共64位,它表示的数值有2的64次方,平分正负,数值范围是负2的63次方到正2的63次方-1。
  而float在内存中占4个字节,共32位,但是浮点数在内存中是这样的:
  V=(-1)^s * M * 2^E
   667x190
  浮点数的32位不是简单的直接表示大小,而是按照一定的标准分配的。
  其中第1位,符号位,即S。
  接下来的8位,指数域,即E。
  剩下的23位,小数域,即M,M的取值范围为[1,2)或[0,1)。
  也就是说,浮点数在内存中的二进制值不是直接转换为十进制数值的,而是按照上述公式计算而来,通过这个公式,虽然只用到了4个字节,但是浮点数却比长整型的最大值要大。

  这也就是为什么在数据转换的时候,long类型转换为float类型的根本原因所在!

 

一个数据在计算机的内存中保存时,需要一定的空间,这种“空间”由程序中的“数据类型”(比如int/long/float)来告诉编译器。
在数据类型所占用的空间范围内的数据,可以进行类型转换或者强制类型转换,也许会有一些误差,但一般不会出现离奇的“错误的结果”
另外,占用空间小的数据类型(比如int)向占用空间大的数据类型(比如long)转换,一般也不会出现“错误的结果”
但是反过来,占用空间大的数据类型向小的数据类型转换时,由于有可能会丢失数据的精度,所以编译器会提示错误;这个时候可以选择强制类型转换,但有时会得到“意想外的结果”

Java中规定:
int占用4个字节
long占用8个字节
float占用4个字节

int和long的转换很容易理解,
4个同学去有4张床位的寝室和去有8张床位的寝室,都能很好的容纳;
8个同学去有8张床位的寝室,没有问题;去仅有4张床位的寝室就容纳不下了。

楼主问的问题可以转化为:为什么long型占用8个字节,但相对于仅占用4个字节的float时的行为却很像“小数据类型”
(为什么long可以转换为float,而反过来float转换为long时,有时会出问题)

Java语言数据类型之间的合法转换

6个实心箭头代表无数据丢失的转换
3个虚心箭头代表可能有精度损失的转换
没有箭头的代表通常不能进行转换
(参考:JAVA 核心技术 卷I:基础知识 图3-1)

核心技术的作者给出的例子如下:
int n = 123456789;
float f = n; // f is 1.23456792E8
从n到f转换时,虽然得到了同样大小的结果,但却失去了一定的精度。

说白了就是long型虽然占用8个字节,但是由于要非常严密精确的表达每一位数,
能够表达的数的范围,反倒没有占用4个字节的float型能够表达的数据范围大

本文转载自:http://blog.csdn.net/hexu8080/article/details/53924178

H
粉丝 4
博文 102
码字总数 12788
作品 0
广州
私信 提问
Java开发每日复盘2018_0514

今天主要跟大家分享3个部分: 一、「Java的核心机制」 二、「Java命名规范」 三、「Java数据类型相关」 下面我们来一个一个的说: 「Java核心机制」 Java是一种强制面向对象的解释型语言(O...

ZeroOSTalk
2018/05/14
0
0
Java小白进阶笔记(2)-变量和数据类型

1.Java有多少种数据类型,数据类型的分类? 两种数据类型: 基本数据类型 引用数据类型 除了八种基本数据类型,其他的都是引用数据类型。 2.Java的工作机制? Java程序的源代码(.java)编译...

阿里云云栖社区
2018/05/25
0
0
Java到底是不是一种纯面向对象语言?

Java——是否确实的 “纯面向对象”?让我们深入到Java的世界,试图来证实它。 在我刚开始学习 Java 的前面几年,我从书本里知道了 Java 是遵循 “面向对象编程范式(Object Oriented Progr...

Java工程师-10
2017/05/25
677
5
Java八种基本数据类型的比较及其相互转化

java中有且仅有八种基本数据类型,记住就行,共分为四类: 第一类:整型--》byte short int long 第二类:浮点--》float double 第三类:逻辑--》boolean 第四类:字符--》char (基础数据类型...

蛮卍
2015/01/14
1K
0
深入浅出 Java 中的包装类

前阵子,我们分享了《Java中的基本数据类型转换》这篇文章,对许多粉丝还是有带来帮助的,今天讲一下 Java 包装类的的由来,及自动装箱、拆箱的概念和原理。 什么是包装类型 Java 设计当初就...

Java技术栈
2018/09/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
5
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
43
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部