求助:为什么double型超出MAX_VALUE了却不会溢出?
如果用Integer.MAX_VALUE加上100,会出现溢出,得到的结果是负数;
如果用Long.MAX_VALUE加上100,也会出现溢出,得到的结果是负数;
但是,如果用Double.MAX_VALUE加上100.0, 并不会溢出,得到的结果仍是Double.MAX_VALUE的数值。
百思不得其解,请问这是什么原因呢?
程序如下:
public class TestOverflow {
public static void main(String[] args) {
int a=Integer.MAX_VALUE;
long b=Long.MAX_VALUE;
double c=Double.MAX_VALUE;
double d=Double.MAX_VALUE-10.0;
System.out.println(a+" "+(a+100));
System.out.println(b+" "+(b+100));
System.out.println(c+" "+(c+100.0));
System.out.println(d+" "+(c+d)); }}
运行结果如下:
溢出(错误 6):
当赋值超出目标的限制时,就会发生溢出。此错误有以下的原因和解决方法:
*赋值、计算或数据类型的结果的转换太大,以致于不能在变量类型所允许的范围内表示出来。
赋值给足够表示值的范围的类型的变量上。
*给属性的赋值超过属性能接受的最大值。
确保赋值适合属性的范围。
*试图在计算中使用一个数字,并且该数字被强制为一个整数,但是结果超过了整数的范围,例如:
12 Dim x As Long x = 2000 * 365 ' 错误: 溢出
要解决这个问题,请按如下方式键入该数字:
12 Dim x As Long x = CLng(2000) * 365
详细信息,可选取有问题的项目,并按下 F1 键查看帮助。
你的这个很正常,double的有效位是16位,你的100根本没达到它的精度.所以对结果没有影响
可以好好复习下c语言的数据类型知识,基础很重要单精度型:float,数据以32位二进制形式存入内存单元双精度型:double,数据以64位二进制形式存入内存单元当一个变量的值超过了变量所能表示的范围时,将产生溢出。一个变量只能赋给与之类型相匹配的变量