日期:2014-05-20  浏览次数:20731 次

初学者基础问题,我的ID就是立刻结贴的保障!
为什么short i = 10;
没有错而float a = 1.0;却有错。
(不要回答我将1.0改成1.0F)

整数默认全当做int来处理,浮点数默认全当做double来处理,是这样的吧?
如果是这样的话,那为什么
short i = 10;没有错,10不应该是int类型的么?
如果说10没有超过short的范围,所以可以这么做,那为什么float a = 1.0;又有错了?1.0也没有超过float的范围啊?


为什么1/ 0有错而1 / 0.0没有错?得到的是无穷。
这不都是0么。

谢谢回答。!

------解决方案--------------------
见:

http://java.sun.com/j2se/1.4.2/docs/api/constant-values.html

关于POSITIVE_INFINITY的定义:

public static final double POSITIVE_INFINITY 1d/0d
public static final float POSITIVE_INFINITY 1f/0f

LZ明白了吧。
------解决方案--------------------
应该这么说,JAVA对于整数的处理和对于浮点数的处理不同。

对于浮点数而言,所有的浮点数默认为double进行处理。应该是因为浮点数有单精度和双精度的区别,所以不会自动转换类型。
例如:

float m=1.0;//它会提示:Type mismatch: cannot convert from double to float
float m=1.0f;//这个显示指定了使用单精度,当然没问题。

对于整数而言,它默认的确是int类型,但是如果没有超出当前类型大小则会默认进行转换。
我们从下面可以看出默认的是int类型。
对于long
long mm=9999999999;//The literal 9999999999of type int is out of range 
这里对于Int来说是超出范围了
long mm=9999999999L// 这个却没有错误,说明默认就是Int类型的。




byte m=1;//没有问题吧,根据当前是byte来处理。
byte m=444;//明显就会提示:Type mismatch: cannot convert from int to byte

可见范围超出之后它默认使用Int来处理了。

short m=1;//没问题
short m=1111111111;//Type mismatch: cannot convert from int to short



------解决方案--------------------
楼上的说得很对,我来补充几句:
类型 存储需求 取值范围
float 4字节 大约(+/-)3.402 823 47E + 38F(有效位数为6~7位)
double 8字节 大约(+/-)1.797 693 134 862 315 70E + 308(有效位数为15位)

double表示这种类型的数值精度是float的两倍(有人称之为双精度)。绝大部分应用程序都采用double类型。在很多情况下,float类型的精度很难满足要求。例如,用7位有效数字足以精确表示普通雇员的年薪,但表示公司总裁的年薪可能就不够用了。实际上,只有很少的情况适合使用float类型,例如,需要快速的处理单精度数据,或者需要存储大量数据。

float类型的数值有一个后缀F(例如,3.402F)。没有后缀F的浮点数值(如3.402)默认为double类型。当然,也可以在浮点数值后面添加后缀D(例如,3.402D)。

------解决方案--------------------
1/0.0,除数的0.0在计算时并不是零,它是有精度的,这个数<<<1,得到当然是无穷啊
------解决方案--------------------
为什么 1 / 0 有错而 1 / 0.0 没有错?得到的是无穷。这不都是 0 么。
注意:0.0 是 double 类型常量,0 是 int 类型常量,1 / 0.0 要首先将 1 自动类型转换到 1.0 再完成浮点数相除计算结果自然是 double 类型的,而 double 类型变量按 IEEE754 标准可以取到三个特殊值即 NaN 正无穷 负无穷,所有可以。而 1 / 0 因为两边都是 int 型常量,所以是整除,而整除结果当然是 int 型整数,int 型变量无法表示和存储无穷这个特殊值,当然不可以,运行到这儿会抛 ArithmeticException 运行时异常。
------解决方案--------------------
short 这个是编译器干的。因为你用的是常量,所以编译时没有问题。
如果你输入的数字大于short的最大数,则编译会出问题。

而整数的转换是从 int 想 long ,所以一般没问题。
而浮点的转换是从 double 向 float ,所以出现了问题。



------解决方案--------------------
引用楼主 joejoe1991 的帖子:
那为什么
short i = 10;没有错,10不应该是int类型的么?
如果说10没有超过short的范围,所以可以这么做,那为什么float a = 1.0;又有错了?1.0也没有超过float的范围啊?