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.)