• ベストアンサー

四捨五入について

技術評論社より出版の、「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

  • 算数の四捨五入が分かりません

    小学生レベルの四捨五入の問題なのですが、 (1) 0.75を小数第一位で四捨五入し、整数で表せ (2) 0.01を小数第二位で四捨五入し、小数第一で表せ (3) 4.2を小数第一位で四捨五入し、整数で表せ などという問題が、昔のことですっかり忘れてしまって分からない状態なんです。 ちなみに(1)の答えは『1』なんじゃないかな、と考えたりもしたのですが違うのでしょうか? このような四捨五入の仕方を教えていただけると助かります。 明日までにどうしても解かなければならないので、回答宜しくお願いします!

  • 四捨五入

    実数Xの小数点以下2桁目を四捨五入して実数Hとするプログラムと Xの10の位を四捨五入して整数Lとするプログラム(Xは正の整数) を教えてください。

    • ベストアンサー
    • Java
  • %の四捨五入について

    こんにちは、 例えば、ある計算をして、A,Bの占める割合が A1  50.045% B1  49.955% のとき、小数点第3位を四捨五入すると、 A2  50.05% B2  49.96% となりますが、加算すると、100.01となり100% になりません。 このようなとき、A2,B2は、どのように表現すればよいのでしょうか?

  • エクセルの四捨五入の合計

    エクセルで表計算をして、小数一位で四捨五入した場合ですが、横の計は四捨五入後の整数でいいのですが、縦の計をオートシグマで集計すると四捨五入前の計になり、合計があいません。これを四捨五入後の整数の合計にできないでしょうか?

  • Excelの関数、四捨五入について

    ご質問があります。 現在Excelで表を作っているのですが、どうしても四捨五入で躓きます。 例) A 1234.56 →四捨五入(ROUND.1) →B 1235 上記のようになるのですが 例) B 1235×0.9 → 1111.1(小数点第一表示) 上記のようになってしまいます。 四捨五入したBのセルに対し0.9をかけているはずなのに 四捨五入を行う前のAに0.9をかけた答えが出てしまうのです。 これの謎が解けず困っています。 どなたかお分かりの方がいましたら宜しくお願い致します。

  • Excel 2000 四捨五入について教えて下さい

    セルの書式設定で 表示形式        通貨 小数点以下の桁数    0 としてます。 そうすると、四捨五入されてしまうのですが、止める方法はありますか。 やりたいこと・・・・・・  A列         B列 整数部       小数点以下 A列に小数混じりの数字を記入するとB列に少数以下の文字を返す。 A列は整数部のみを表示する。 A列に25.5を記述すると A | B 25 | 5 B列関数  =IF(A6="","",IF((A6-INT(A6))*10=0,"",(A6-INT(A6))*10)) A列には関数は入れてません。 すみません。宜しくお願いします。 ついでに・・・・・ 623,154,241.5 上の値を桁区切りでセル別に表示させることは可能でしょうか?? A | B | C | D | 623 | 154 | 241 | 5 | の様にさせたい。 無理なら良いです。 なるべくVBAを使用したくありません。 最悪は使用してみようと思いますが。 宜しくお願いします。

  • 四捨五入について質問です。

    四捨五入について質問です。 GUIアプリのエディットコントロール画面から、任意の数値を入力させ、 小数点以下n桁で四捨五入をさせたいと考えています。 しかし、なかなかうまくいかないのが現状です。 試したのは以下の通りです。 ・atofを用い、数値を取り込み、下位n桁目を四捨五入 -> 当然だめです ・atoiを用い、数値を取り込み、10^nをかけて整数値にしてから四捨五入 -> 0.05と0.0499...の違いがつけられない やはり文字列処理しかないのでしょうか? (文字列を取り込み、小数点以下n文字目が5以上かどうかで判定、のような・・・) もしよろしければ、皆さんのお知恵をお貸しください。

  • 四捨五入と切り捨て

    平均を出す問題について教えてください。 「答えは、小数点以下を切り捨てにして整数で出す。あらかじめ概数にして計算する」とあった場合、「あらかじめ概数にして」というのは、切り捨てにすればよろしいのでしょうか? それとも、四捨五入でしょうか? 教えてください。

  • 四捨五入

    ExcelでA4に13、B4に5、C4は=A4/B4です、2.6とでます、、以下を四捨五入したい式をお願いします。

  • PHP5における四捨五入について

    PHP5でラウンド関数を使用しても境界値の5の値を切り捨ててしまい,四捨五入が上手くできません。 具体的には,以下の感じです。 $C = ROUND($B / $A,2) "C=282.25" $D = ROUND($C,1) "D=282.2" ※データ型は特に定義していません。 どのようにしたら四捨五入が上手くできるか教えて頂けないでしょうか。よろしくお願いします。

専門家に質問してみよう