Математические значения не вычисляются должным образом

По какой-то причине я получаю другие математические значения, чем должны быть. Что я здесь делаю неправильно?

Код:

overtimeHours = hoursWorked - 40;

regularPay = hourlyWage * hoursWorked - overtimeHours;
overtimePay = 1.5 * hourlyWage * overtimeHours;
totalPay = hourlyWage * hoursWorked + overtimePay;

Выход:

Please enter employee's name: John
Please enter The Dragon's hourly wage: 22.50
Please enter how many hours The Dragon worked: 48.5

John's Wages
Regular Pay: $    1082.75
Overtime Pay: $    286.88
Total Pay: $    1378.13

person TheEliteTech    schedule 18.02.2014    source источник
comment
Я должен получать регулярную оплату: 900,00, сверхурочную страницу: 286,88, общую оплату: 1186,88. Мое значение сверхурочной работы правильное, но не другие значения.   -  person TheEliteTech    schedule 19.02.2014
comment
переменные целые?   -  person Zavior    schedule 19.02.2014
comment
Всегда используйте скобки. Это просто делает написание и чтение кода намного проще   -  person RyanS    schedule 19.02.2014
comment
@RyanS Обратите внимание, что в США и, насколько мне известно, в программировании в целом принято вызывать () круглые скобки; скобки обычно относятся к квадратным скобкам [].   -  person chrylis -cautiouslyoptimistic-    schedule 19.02.2014
comment
Ваша первая ошибка — использовать числа с плавающей запятой для денежных значений, что рано или поздно вызовет проблемы. Кроме того, как отмечали другие, в ваших расчетах отсутствуют скобки.   -  person David Conrad    schedule 19.02.2014
comment
@Chrylis, ах, да, я знаю об этом, просто привычка называть их скобками. Большинство людей, которых я знаю в Канаде, также называют их скобками и явно называют квадратными скобками.. квадратные скобки, лол   -  person RyanS    schedule 19.02.2014
comment
Использование BigDecimal является рекомендуемым способом представления денег, поскольку числа с плавающей запятой всегда имеют небольшую разницу в округлении.   -  person wypieprz    schedule 19.02.2014


Ответы (1)


Порядок операций, как вы учили в базовой математике. Вы рассчитываете

(hourlyWage * hoursWorked) - overtimeHours

Вместо этого вы хотите

hourlyWage * (hoursWorked - overtimeHours)

Кроме того, вам не следует выполнять перерасчет в total; вместо этого просто добавьте обычные и сверхурочные.

Наконец, как отмечает @CodeMonkey, вы безоговорочно предполагаете, что человек работает сверхурочно. Вот что я предлагаю вместо этого:

if(hoursWorked > 40) {
    regularHours = 40;
    overtimeHours = regularHours - 40;
} else {
    regularHours = hoursWorked;
    overtimeHours = 0;
}
person chrylis -cautiouslyoptimistic-    schedule 18.02.2014
comment
Кроме того, не забудьте принять во внимание, что если вы когда-либо отработаете менее 40 часов, вы получите отрицательную сверхурочную работу и отрицательный доход! :-) - person CodeMonkey; 19.02.2014
comment
Да. Я понял это. Я вставил свой System.out, чтобы не отображать сверхурочную работу, если она меньше или равна 0. - person TheEliteTech; 19.02.2014
comment
@TheEliteTech Ваши расчеты все равно будут неверными; вам нужно учитывать сверхурочные/не сверхурочные таким образом, как я показал. - person chrylis -cautiouslyoptimistic-; 19.02.2014
comment
Я только что понял это прямо перед тем, как вернулся, чтобы проверить этот пост. Я согласен. Спасибо. - person TheEliteTech; 19.02.2014