• ベストアンサー

四捨五入について

技術評論社より出版の、「C言語による最新アルゴリズム事典」(奥村晴彦著)の「四捨五入」の項目について質問です。 「a >= 0, b > 0の2整数について、a / bを四捨五入で小数第一位までに丸める方法」が以下のように書かれています。 整数型変数rを使って、 r = (10 * a + b / 2) / b; printf("a / b = %d.%d\n", r / 10, r % 10); rには、結果の小数a.bが10 * a + bの形に入ることになるのでしょうが、何故そうなるのかわかりません。 どうかご教授ください。m(__)m

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

このアルゴリズムの目的は、割り算による誤差をなくすことです。 そのため、整数演算をメインにしています。 実数で四捨五入するなら、 floor(10.0*a/(double)b+0.5)/10.0 でしょう。これを、割り算を後回しにすると、 floor((10.0*a+0.5*b)/b)/10.0 となりますね。これを整数演算にしたものが提示された式です。 (10*a)%b+b/2がb以上であれば(10*a+b/2)/bは(10*a)/b+1となります。この仕組みで四捨五入が実現されています。 bが奇数の場合、b/2の余りが捨てられてしまいますが、(10*a)%bが(b+1)/2以上でないと切り上げる必要がないので、問題ありません。

wiles4416
質問者

お礼

よくわかりました! ご丁寧にどうもありがとうございました。

関連するQ&A

専門家に質問してみよう