Java中long数据类型转化为float疑问解答
来源:互联网 发布:ceo cfo cmo 知乎 编辑:程序博客网 时间:2024/06/15 06:22
最为一个常识,我们都知道浮点型在内存中占用的是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型能够表达的数据范围大
- Java中long数据类型转化为float疑问解答
- java中数据类型转换 Integer String Long Float Double Date
- java中数据类型转换 Integer String Long Float Double Date
- java中数据类型转换 Integer String Long Float Double Date
- Java 中的long 和 float 的转化
- Java中关于为什么long能自动转换成float类型的疑问解决
- java int 转化为Long integer转化为Long
- java中Long类型转化为int类型
- java中数据类型转换 Integer String Long Float Double Date Char
- long转换为float
- dt中ID转化为long[]
- java中数据类型double&float
- Java基本数据类型:long与float之间的转换疑惑
- Java中long类型为何会自动转换为float类型?(未整理)
- int转化为long
- BigInteger转化为Long
- JAVA中long与int的转化
- java中Long类型数据必须转化为int才能正确比较
- java转换json
- 加载框效果
- hdu 2602 01背包
- java,抽象类与接口的区别
- 巧用Delphi制作溅射屏幕
- Java中long数据类型转化为float疑问解答
- linux 重启执行程序
- 进程与线程线程
- for循环内嵌递归用于排列组合
- tomcat manager 403 access denied
- Wireshark基本介绍和学习TCP三次握手
- Docker三剑客之Compose-三
- js里的方法
- Android开发-魔窗DeeplinkDemo-AndroidStudio