2014-02-02 6 views
0

У меня есть простой вопрос, почему нам нужно использовать специальные литералы, когда уже очевидно, какой тип переменной мы используем.Зачем нам нужны числовые литералы в Java?

Например, вы можете видеть, что мы используем двойной тип здесь. И я думаю, что компилятор тоже должен это видеть. Но если я бегу такой код:

double no_double = 60*(1000/3600); 
System.out.format("result is: %.3f",no_double); 

Я получаю результат: 0,000.

Но если я запускаю этот код:

double a_double = 60.0*(1000.0/3600.0); 
System.out.format("result is: %.3f",a_double); 

Тогда я получаю верный результат: 16,667.

Так зачем нам использовать литералы?

выше. Java Примитивные типы данных http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

+2

Это все литералы. Что вы имеете в виду, «зачем нам явно различать целые и плавающие литеры?». –

+0

Но ответ таков; потому что это не так, как работает язык. В общем, типы подвыражений не выводятся из того, где они используются. –

+0

@Reimeus 'double' вовсе не является именем, это ключевое слово и именование переменной' double' приведет к сбою компилятора :) – BackSlash

ответ

4

Вы делите два целых числа.
Результатом этого является другое целое число.

Назначение этого целого числа в значение double позже не изменяет деление.

0

Это не очевидно, поскольку компилятор (или JVM) не может знать, хотите ли вы поплавки или целые числа.

Я бы сказал, что математика с плавающей запятой сложна, если вы рассматриваете все угловые случаи. Поплавки невелики по дизайну, тогда как с целыми числами вы получаете точные результаты. Если вы можете придерживаться точных результатов, часто бывает лучше сделать это и прибегать к поплавкам только тогда, когда это явно необходимо. Например, если вам нужно сравнить равенство двух переменных, с поплавками вы должны дать ему некоторые границы и определения относительно того, что вы считаете равным. С целыми числами в этом нет необходимости, это самоочевидно.

Существуют языки программирования sevaral, где такого рода явное разделение не происходит, возможно, JavaScript и PHP являются самыми популярными. Они выбирают автоматическое преобразование типов данных «на лету». Это приводит к некоторым значительным накладным расходам и дополнительным проблемам в долгосрочной перспективе, когда вам нужно знать точно что это за переменная, которую у вас есть в ваших руках.

Существуют и другие языки программирования, которые даже не имеют этих разных типов данных. Возможно, все есть только объект. Это один из способов его решения.

+0

«Поплавки неточны» - не совсем; их поведение четко определено. Они имеют разные характеристики для целочисленных типов. –

+0

@OliCharlesworth поведение только хорошо определено, если вы используете поплавки, как указано стандартом IEEE или каким-либо другим жестким стандартом. Это не относится ко всем поплавкам (но да, это применимо к java-поплавкам). Мое основное соображение заключалось в том, что внутреннее представление float обычно означает, что они являются неточными в качестве значений, когда вы пытаетесь использовать их в мире номера базы 10, даже если их поведение четко определено. – eis

+0

Я думаю, что важно сделать это различие. '2.0/5.0 == 1.333333333333', безусловно, не менее точен, чем' 2/5 == 1'. –

0

Это только часть спецификации Java как языка C-типа. Per the specification, если целочисленные значения не выражены в выражении, тогда результат вычисления является целым числом. Разработчики языка могли бы решить сделать все расчетные числа с плавающей запятой, но решили не делать этого, вероятно, потому, что это поведение для примитивных типов не было знакомо программистам на C и C++, а также потому, что они замедляют работу.

Смежные вопросы