В исследовании этого для ответа на него я немного смущен, что поведение, которое Вы видите, происходит, конечно, действие нажатия на меню File или что имеет Вас, должен не сфокусировать текстовое поле и установить его на меню?
Потому что деление выполняется целыми числами, которые затем преобразуются в двойное. Попробуйте вместо этого:
double pct = (double)x / (double)y;
Это действительно то же самое во всех C-подобных языках. Если разделить два целых числа, результат будет целым. 0,73 не является целым числом.
Обычным решением является умножение одного из двух чисел на 1,0, чтобы сделать его типом с плавающей запятой, или просто приведение его.
Целочисленное деление отбрасывает дробную часть результата. См .: http://mathworld.wolfram.com/IntegerDivision.html
, потому что операция все еще выполняется с типом int. Попробуйте double pct = (double) x / (double) y;
Важно понимать поток выполнения в строке кода. Вы правы, полагая, что установка правой части уравнения равной double
(в левой части) неявно преобразует решение как double. Однако выполнение потока требует, чтобы x / y вычислялся сам по себе , прежде чем вы даже дойдете до части кода double pct =
. Таким образом, поскольку два int
разделены друг на друга, они будут оценивать решение int
(в данном случае с округлением до нуля) до того, как будет неявно преобразовано в двойное.
Как уже отмечалось, вам нужно преобразовать переменные int
как double
s, чтобы решение получилось как double
а не как int
.
Это потому, что тип левого операнда деления ( x
) имеет тип int
, поэтому возвращаемый тип x / y
по-прежнему int
. Тот факт, что переменная назначения имеет тип double
, не влияет на операцию.
Чтобы получить желаемый результат, сначала необходимо преобразовать (преобразовать) x
в double
, как в:
double pct = (double)x / y;