Java:为什么我不能使用科学记数法声明整数类型?

时间:2013-07-14 05:18:52

标签: java integer long-integer scientific-notation exponent

我可以很容易地将2e15简单地看作“两千万亿”,但对于2000000000000000我必须计算零,这需要更长的时间并且可能导致错误。

为什么我不能使用intlong这样的文字声明2e91.3e6?我理解10的负幂,例如2e-3,或者小于小数位数的10的幂,例如1.0003e3,会产生浮点数,但为什么不Java允许这样的声明,并且只是截断浮点部分并在结果值是非整数的情况下发出温和警告?

这是一个技术上的原因,为什么这是一个坏主意,还是所有关于类型安全?编译器简单地解析像

这样的语句不是一件容易的事

long x = 2e12long x = 2000000000000 //OK for long

int y = 2.1234e3int y = 2123.4 //warning: loss of precision

3 个答案:

答案 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;
  • 使用Java 7+使用千位分隔符:int y = 2_000_000;

答案 1 :(得分:1)

您在询问有关编写整数文字的规则。看到这个参考: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html 将科学记数法用作整数字面量的能力可能会使事情变得更容易,但尚未实施。我没有看到任何阻止此功能被实施的技术原因。

答案 2 :(得分:1)

因为它是Java的缺点。

(具体来说,显然有一组以科学记数法表示的文字,它们完全用整数和长数表示,并且希望有一种方法可以将这些文字表达为整数和长数。但是,在Java中,它没有'这是一种方法,因为Java的语言定义,所有科学记数法文字都必然是浮点数。)