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

我可以很容易地一目了然地读作“两万亿”,但是我必须数零,这需要更长的时间,并且可能导致错误。2e152000000000000000

为什么我不能使用诸如 or 之类的文字来声明 或 ?我知道负幂 10,例如 ,或小于小数位数的 10 次幂(例如 )将产生浮点数,但是为什么 Java 不允许这样的声明,而只是截断浮点部分并在结果值非整数的情况下发出轻微的警告?intlong2e91.3e62e-31.0003e3

这是一个坏主意的技术原因,还是这都是关于类型安全的?对于编译器来说,简单地解析一个像这样的语句难道不是微不足道的吗?

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

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


答案 1

这是因为当您使用科学记数法时,您会创建一个浮点数(示例中的双精度)。并且您不能将浮点数分配给整数(这将是一个缩小的基元转换,这不是有效的赋值转换)。

因此,这也不起作用,例如:

int y = 2d; //can't convert double to int

您有几种选择:

  • 将浮点显式转换为整数:int y = (int) 2e6;
  • 使用 Java 7+ 使用千位分隔符:int y = 2_000_000;

答案 2

因为这是Java的一个缺点。

(具体来说,显然有一组由科学记数法表示的文字,这些文字正好由整数和长整型表示,并且希望有一种方法将这些文字表示为整数和长整型是合理的。但是,在Java中没有办法做到这一点,因为由于Java的语言定义,所有科学记数法文本都必然是浮动的。