我可以很容易地将2e15
简单地看作“两千万亿”,但对于2000000000000000
我必须计算零,这需要更长的时间并且可能导致错误。
为什么我不能使用int
或long
这样的文字声明2e9
或1.3e6
?我理解10的负幂,例如2e-3
,或者小于小数位数的10的幂,例如1.0003e3
,会产生浮点数,但为什么不Java允许这样的声明,并且只是截断浮点部分并在结果值是非整数的情况下发出温和警告?
这是一个技术上的原因,为什么这是一个坏主意,还是所有关于类型安全?编译器简单地解析像
这样的语句不是一件容易的事 long x = 2e12
为long x = 2000000000000 //OK for long
和int y = 2.1234e3
为int y = 2123.4 //warning: loss of precision
答案 0 :(得分:17)
这是因为当您使用科学记数法时,您创建a floating point number(在您的示例中为双精度)。并且您不能将浮点数分配给整数(这将是一个缩小的原始转换,which is not a valid assignment conversion)。
所以这不会起作用,例如:
int y = 2d; //can't convert double to int
您有几个选择:
int y = (int) 2e6;
int y = 2_000_000;
答案 1 :(得分:1)
您在询问有关编写整数文字的规则。看到这个参考: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html 将科学记数法用作整数字面量的能力可能会使事情变得更容易,但尚未实施。我没有看到任何阻止此功能被实施的技术原因。
答案 2 :(得分:1)
因为它是Java的缺点。
(具体来说,显然有一组以科学记数法表示的文字,它们完全用整数和长数表示,并且希望有一种方法可以将这些文字表达为整数和长数。但是,在Java中,它没有'这是一种方法,因为Java的语言定义,所有科学记数法文字都必然是浮点数。)