| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 10617 人关注过本帖
标题:数值类型转换—— long 转换成 float 为什么不报错?
只看楼主 加入收藏
蝌蚪变青蛙
Rank: 1
等 级:新手上路
帖 子:12
专家分:5
注 册:2014-4-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
数值类型转换—— long 转换成 float 为什么不报错?
追本溯源——JAVA中为什么float型最大值大于long型?
  最为一个常识,我们都知道浮点型在内存中占用的是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类型的根本原因所在!

-----------------------------------------------------------------------------------------------------------
上面是我在网上自己找的答案。。。回答都大同小异,太专业了。。我比较笨,好像想明白了点,又不是很明白。有没有人能用通俗一点的话解释下。。。
搜索更多相关主题的帖子: 最大值 JAVA 空间 
2014-05-10 10:41
日知己所无
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:38
帖 子:427
专家分:2071
注 册:2014-3-22
收藏
得分:0 
程序:
程序代码:
public class CastTest {
    public static void main(final String[] args) {
        int intValue = Integer.MAX_VALUE;
        long longValue = Long.MAX_VALUE;
        float floatValue = Float.MAX_VALUE;

 
        System.out.println("Integer.BYTES:" + Integer.BYTES);
        System.out.println("Long.BYTES:" + Long.BYTES);
        System.out.println("Float.BYTES:" + Float.BYTES);
        
        System.out.println("intValue:" + intValue);
        System.out.println("longValue:" + longValue);
        System.out.println("floatValue:" + floatValue);
        
        // 大类型向小类型转换,要么编译出错,要么在一定情况下溢出
        // intValue = longValue;   // 编译出错,提示从long型转换为int型时会丢失精度
        intValue = (int)longValue; // 正常编译,由程序员自己负责,即使丢失精度也要强制转换
        System.out.println("intValue:" + intValue); // 强制转换的结果为错误值:-1
        intValue = Integer.MAX_VALUE;
        
        // 小类型向大类型转换,不会发生问题
        longValue = intValue;
        System.out.println("longValue:" + longValue); // 正常输出2147483647
        
        // 大类型向小类型转换,要么编译出错,要么在一定情况下溢出
        // longValue = floatValue;    // 编译出错,提示从float型转换为long型时会丢失精度
        longValue = (long)floatValue; // 正常编译,由程序员自己负责,即使丢失精度也要强制转换
        System.out.println("longValue:" + longValue); // 强制转换的结果为错误值:9223372036854775807
        longValue = Long.MAX_VALUE;
        
        // 小类型向大类型转换,不会发生问题
        floatValue = longValue;
        System.out.println("floatValue:" + floatValue); // 正常输出9.223372E18
    }
}


输出:
程序代码:
Integer.BYTES:4
Long.BYTES:8
Float.BYTES:4
intValue:2147483647
longValue:9223372036854775807
floatValue:3.4028235E38
intValue:-1
longValue:2147483647
longValue:9223372036854775807
floatValue:9.223372E18
2014-05-10 13:37
日知己所无
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:38
帖 子:427
专家分:2071
注 册:2014-3-22
收藏
得分:20 
一个数据在计算机的内存中保存时,需要一定的空间,这种“空间”由程序中的“数据类型”(比如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型能够表达的数据范围大

嗯,解释了半天,最好对你有些帮助
2014-05-10 14:09
蝌蚪变青蛙
Rank: 1
等 级:新手上路
帖 子:12
专家分:5
注 册:2014-4-26
收藏
得分:0 
回复 3 楼 日知己所无
感谢大神解答,我已经弄明白了。
至于核心技术。。我也是买的这本书,第九版。当初在网上找书的时候找了很多,最后找到这本核心技术的时候在网上实在没找到第九版的电子版,只找到个残缺的,看了看感觉还行就买了,然后就悲剧了。就像这个问题,这本书只是在43页用了半页的篇幅讲述,其中一半还是图。。。最后就只告诉我类型直接可以怎么转,至于为什么就不讲。。。还有42页的什么数学函数,一般人谁用的上这玩意,至于41页的位运算符,要不是之前学C的时候研究过补码,鬼才看的懂他写的是什么,从来不讲为什么,不讲原理。。这本书的读者定位至少该是入门级的人才能看了。今天去书城逛了圈,打算找本没人讲也能看懂的,大神有什么好推荐的吗。
2014-05-10 20:50
日知己所无
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:38
帖 子:427
专家分:2071
注 册:2014-3-22
收藏
得分:0 
■不是大神推荐给你的书
本来想给你推荐《Thinking In Java》的,
本着认真负责的精神,我自己先试着用“类型转换”这个关键词检索了一下
嗯,居然没有找到更加详细的信息(小伙伴有点儿小小的惊呆了
但是这本Java业界的泰斗书,还是建议手头有一本(至少是电子版的)
里面论及到的领域,一般还是比较深入的

就我个人的性格而言,比较务实,喜欢动手解决实际问题
如果你大体上浏览过《JAVA 核心技术》了的话,
建议你抽时间认真阅读一下下面这两部书(都很轻薄短小,但很有内涵),
最好自己动手解决一下里面的问题

1)《Effective Java》看一遍,放在一旁,过段时间再看一遍,如此反复,每回都会有新体会的。
2)《Java Puzzlers》(中文版名称《Java解惑》),里面有近百道小谜题,
  是《Effective Java》作者精心设计的,大多数问题都会让Java使用者“( ⊙ o ⊙ )啊!大吃一斤的……”

都看完后,可以看一下大部头《Code Complete》(中文版名称《代码大全》)

■关于《JAVA 核心技术》
至于你提到的问题,我感觉《JAVA 核心技术》是一本“微言大义”的书,
也许用一两笔带过,篇幅并不是很大,但是作者应该是认真考虑过取舍的,
判断的结果是这些信息已经足够程序员编写出正确的代码

不管什么书,都得自己动手敲一下代码,才能真正体会里面的具体意思
比如《JAVA 核心技术》里有BigInteger的完整示例,
参考书中的示例,请试着解决一下下面帖子里楼主提出的问题
(#2楼有我给出的一种解决办法,自己解决之前请暂时不要参考)
http://bbs.

通过这个例子,我想表达的是:
1)2004年Java 5.0 Release时提供了系统层面的解决办法
2)2009年时隔五年之后还是有人给出了下面这样的“不是很完美的解答”
  http://zhidao.baidu.com/link?url=PDyXk4V5KPkO6upLLFh6IozICbxdeufMcxyKfofghZNQI7OAr5xN7rg26rM_sPk4ufPrOV3uObOJ7niato7ARq
3)微言大义的《JAVA 核心技术》里有1页是讲如何阅读联机API文档的
  并且提示:请现在将docs/api/index.html页面,放置在浏览器的收藏夹中。
嗯,总之,我还是想说服你,你确实买了一本好书,认真阅读她吧

[ 本帖最后由 日知己所无 于 2014-5-11 17:56 编辑 ]
2014-05-11 12:12
日知己所无
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:38
帖 子:427
专家分:2071
注 册:2014-3-22
收藏
得分:0 
下面帖子里#2和#3的回复内容也主要引用了《Java核心技术》的内容,可以参考一下
http://bbs.
2014-05-11 17:55
蝌蚪变青蛙
Rank: 1
等 级:新手上路
帖 子:12
专家分:5
注 册:2014-4-26
收藏
得分:0 
回复 6 楼 日知己所无
感谢大神这么详细的解答,不过这本书我已经打算暂时放一边了,等将来有一定基础再看。。。今天又去书城逛了逛,打算找本薄薄的但足够用的书,结果很无语。也许JAVA是比C庞大,但差别也太大了,基本就没看见薄的书。。。之前学C的时候,有人给我推荐了《c primer plus》这本,不过当我看到《the c programming language》的时候立刻就震撼了,前面那本跟砖头一样,C创始人这本才两百来页,砍掉参考手册才160多页。。可我发现JAVA就找不到这样的书,不打算找了,在书城耗了一下午,打算去网上找个视频看了。。。大神你的建议我会记着的,看完视频我再看那本核心技术,不然我怕直接看我会发疯的
2014-05-11 22:07
张哲新
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2016-4-19
收藏
得分:0 
刚注册第一次来,大神讲解的好详细,好帖
2016-04-19 18:06
快速回复:数值类型转换—— long 转换成 float 为什么不报错?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.076416 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved