15

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

为什么我不能声明intorlong使用诸如2e9or之类的文字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

4

3 回答 3

19

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

所以这也不起作用,例如:

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

你有几个选择:

  • 将浮点数显式转换为整数: int y = (int) 2e6;
  • Java 7+ 使用千位分隔符:int y = 2_000_000;
于 2013-07-14T05:22:26.147 回答
2

因为这是Java的一个缺点。

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

于 2014-02-19T20:55:33.457 回答
1

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

于 2013-07-14T05:31:35.013 回答