Nilai Matematika Tidak Dihitung dengan Benar

Untuk beberapa alasan, saya mendapatkan nilai matematika yang berbeda dari yang seharusnya. Apa yang saya lakukan salah di sini?

Kode:

overtimeHours = hoursWorked - 40;

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

Keluaran:

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 sumber
comment
Saya seharusnya mendapat Gaji Reguler: 900,00, Halaman Lembur: 286,88, Gaji Total: 1186,88. Nilai lembur saya benar, tetapi nilai lainnya tidak.   -  person TheEliteTech    schedule 19.02.2014
comment
apakah variabelnya int?   -  person Zavior    schedule 19.02.2014
comment
Selalu gunakan tanda kurung. Itu hanya membuat menulis dan membaca kode jadi lebih mudah   -  person RyanS    schedule 19.02.2014
comment
@RyanS Perhatikan bahwa merupakan kebiasaan di AS dan, sejauh yang saya tahu, dengan pemrograman secara umum, memanggil () tanda kurung; tanda kurung biasanya mengacu pada tanda kurung siku [].   -  person chrylis -cautiouslyoptimistic-    schedule 19.02.2014
comment
Kesalahan pertama Anda adalah menggunakan floating point untuk nilai moneter, yang cepat atau lambat akan menimbulkan masalah. Selain itu, Anda kehilangan tanda kurung dari perhitungan Anda, seperti yang dicatat oleh orang lain.   -  person David Conrad    schedule 19.02.2014
comment
@Chrylis ah iya, saya sadar akan hal itu, hanya kebiasaan menyebutnya tanda kurung. Kebanyakan orang yang saya kenal di Kanada juga menyebutnya tanda kurung dan secara eksplisit menyebutnya tanda kurung siku.. tanda kurung siku haha   -  person RyanS    schedule 19.02.2014
comment
Menggunakan BigDecimal adalah cara yang disarankan untuk merepresentasikan uang karena bilangan floating point selalu memiliki perbedaan pembulatan yang kecil.   -  person wypieprz    schedule 19.02.2014


Jawaban (1)


Urutan operasi, seperti yang Anda pelajari dalam matematika dasar. Anda sedang menghitung

(hourlyWage * hoursWorked) - overtimeHours

Sebaliknya, Anda menginginkannya

hourlyWage * (hoursWorked - overtimeHours)

Selain itu, Anda tidak boleh menghitung ulang di total; sebagai gantinya, tambahkan saja reguler dan lembur.

Terakhir, seperti yang dicatat oleh @CodeMonkey, Anda tanpa syarat berasumsi bahwa orang tersebut bekerja lembur. Inilah yang saya sarankan:

if(hoursWorked > 40) {
    regularHours = 40;
    overtimeHours = regularHours - 40;
} else {
    regularHours = hoursWorked;
    overtimeHours = 0;
}
person chrylis -cautiouslyoptimistic-    schedule 18.02.2014
comment
Juga, jangan lupa untuk memperhitungkan bahwa jika Anda mendapatkan jam kerja kurang dari 40, Anda akan mendapatkan lembur negatif dan pendapatan negatif! :-) - person CodeMonkey; 19.02.2014
comment
Ya. Saya pikir itu. Saya memasukkan System.out saya untuk tidak menampilkan lembur jika kurang dari atau sama dengan 0. - person TheEliteTech; 19.02.2014
comment
@TheEliteTech Perhitungan Anda masih salah; Anda perlu memperhitungkan lembur/tidak lembur dengan cara seperti yang saya tunjukkan. - person chrylis -cautiouslyoptimistic-; 19.02.2014
comment
Saya baru mengetahuinya sebelum saya kembali untuk memeriksa posting ini. Saya setuju. Terima kasih. - person TheEliteTech; 19.02.2014