2017-01-17 13 views
0

プログラミングの新機能です。以下は、「あなたの時間単位の賃金は何ですか?」と表示されるプログラムでの私の試みです。ドルの額を読んで給与を計算します。 "1年間のあなたの総収入はXドルとYセントです。ドルセントの額からセントを分離するにはどうすればいいですか?

ドルをドルから分けるために、私はダブルからintに変換して値を切り捨てました。どのようにセントを取得するか分からなかったので、私はdollars.cents(* 100)からドルを差し引くことができたと思ったので、セントの数を持っていました

私はプログラムを実行し、

ユーザーが時間単位の賃金として18.33を入力すると、合計金額は31826、収入総額は31836.40になりますが、それらを減算して100を掛けて計算すると、私は40の代わりに39セントを与えられる。

int main(void) { 

double totalIncome  = 0.0; 
int totalDollars   = 0; 
int totalCents   = 0; 
double hourlyWage  = 0.0; 
int hoursPerWeek   = 40; 
const int WEEKS_PER_YEAR = 52; 

printf("What is your hourly wage? "); 
scanf("%lf", &hourlyWage); 

totalIncome = hourlyWage * hoursPerWeek * WEEKS_PER_YEAR; 
totalDollars = totalIncome; //converts to int from double 
totalCents = 10 * (totalIncome - totalDollars); 

printf("Your total income over a year is %d dollars and %d cents", totalDollars, totalCents); 

return 0; 

} 
+1

'-Wall'でコンパイルすると、警告が出ますか? totalCentsをどのように割り当てると精度が低下するかと思います。しかし、私は100%確実ではありません。そのフラグでコンパイルし、チェックしてください。 –

+0

私はこのハック解決策を思いついた... totalCents =((totalIncome + 0。005) - totalDollars)* 100; –

+0

私はあなたが何を意味するのか分かりません-Wall私はこれまでに新鮮なものです –

答えて

3

問題は100*(totalIncome - totalDollars)が正確に40ではないということですが、3.999999999941792e+01、これint利回り39にキャストこれは、1つの通貨を計算するために、浮動小数点を使用しないでください、なぜ良い例です。

ところで:あなたは、単に完全にあなたのコード内 scanf("%d.%d", &hourlyDollars, &hourlyCents);

+0

この解決法が大好きですが、ユーザーが10.00を10.00とした場合、何が起こりますか?これはまだ動作しますか? –

+0

はい、実際には10を「hourlyDollars」に読み込むだけです。しかし、これはすべてのケースをカバーする最も信頼できる解決策ではないかもしれませんが、初期の解決策でもチェックは行われませんでした。 – cthl

-1

一つの問題のようなものを使用してこの問題を回避することができますことは、あなたがtotalCents = 10 * (totalIncome - totalDollars);

を交換していない100

、10でセントを乗算していることですwith

totalCents = 100 * (totalIncome - totalDollars);

あなたはまだ約1セントの浮動小数点の不正確さがあります。

+0

Mr downvoter、気をつけて説明してください – VHS

+1

ダンノー、私の推測では、 'x 10'の問題は浮動小数点の不正確さの主な問題の接線です。それについて心配する必要はありません。はい、それはイライラしていますが、それは過去と同じくらい悪くはありません。あなたが良いS.O.であることを確認してください。市民、そして遅かれ早かれ、フレークはすべて消え去ります。 –

+0

VHSありがとう、私はちょっと後にそれをキャッチした。タイプミスでもなく、悪い数学でもなかった。 o_O –

1

lround()又はllround()

long long cents = llround(x * 100.0); 
を使用し、最も近い整数セントに浮動小数点お金を取る round()又は rint()

double x; 
double cents = rint(x * 100.0); 

を使用し、最も近い整数にポイントセント浮動する浮動小数点お金を取ります

FPドルをドルとセントセントに分割して拡大縮小し、丸めてから分割する。

double x; 
double cents = rint(x * 100.0); 
double cent = fmod(cents, 100.0); 
double dollar = (cents - cent)/100; 

お金をサポートするために、種類を混合しないでください。 long longまたはdoubleを使用してください。それぞれはshort comingsです。学習者プログラムは、最小の金種(セント)のワイド整数型から始まります。

関連する問題