Java: Почему я не могу объявлять целочисленные типы, используя научную нотацию?

Я могу легко прочитать 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

Ответ 1

Это потому, что, когда вы используете научную нотацию, вы создаете номер с плавающей запятой (двойной пример в вашем примере). И вы не можете назначить число с плавающей точкой в ​​целое число (это будет сужение примитивного преобразования, которое не является допустимым преобразованием присваивания).

Так что это не сработает, например:

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

У вас есть несколько вариантов:

  • явно сбрасывает число с плавающей точкой в ​​целое число: int y = (int) 2e6;
  • с Java 7+ используйте тысячу разделителей: int y = 2_000_000;

Ответ 2

Вы спрашиваете о правилах написания целых литералов. См. Эту ссылку: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html Возможность использовать научную нотацию как целочисленный литерал может сделать вещи проще, но не реализованы. Я не вижу никаких технических причин, которые помешали бы реализовать такую ​​функцию.

Ответ 3

Потому что это недостаток Java.

(В частности, есть явно набор литералов, представленных научной нотацией, которые точно представлены ints и longs, и разумно хотеть способ выразить эти литералы как ints и longs. Но в Java нет ' Это способ сделать это, потому что все литералы научной нотации обязательно плавают из-за определения языка Java.)