C言語における割り算の、小数点以下を切り上げする方法について記載します。
小数点以下を四捨五入する場合については 整数の割り算で小数点を四捨五入する を参照ください。


 

整数の切り上げ

 C言語で割り算の切り上げを行いたい場合は以下のように書くことができます。

1.
2.
3.
4.
5.
6.
7.
8.
9.
    unsigned int    myWaruKazu      = 5u;   // 割る数
    unsigned int    myWarareruKazu  = 6u;   // 割られる数
    unsigned int    myResult;               // 結果
‌ 
    // ====== 普通に切り捨ての割り算を行う
    myResult    =  (unsigned int)( myWarareruKazu / myWaruKazu );
‌ 
    // ====== あまりがあるなら、繰上げ分として1足す
    myResult    += ( myWarareruKazu % myWaruKazu ) != 0u ? 1u : 0u;
このコードは CodePublisher で生成しています

 

もうちょっとかっこいい式

 上の式をもうちょっとかっこよく書いてみました。やっていることは同じです。

1.
2.
3.
4.
5.
6.
7.
    unsigned int    myWaruKazu      = 5u;   // 割る数
    unsigned int    myWarareruKazu  = 6u;   // 割られる数
    unsigned int    myResult;               // 結果
‌ 
    // ====== 最初から割る数を1個足しておいて、割り算する
    myResult    =  (unsigned int)( myWarareruKazu + (myWarukazu - 1u)) / myWaruKazu );
    // (-1しているのは、同じ数で割り算したときに1足してしまうため(例えば8÷8のとき1足してしまう))
このコードは CodePublisher で生成しています

[2011.12.28] 上記の式が正しいことを、100000*100000回の試験にて確認しました。

 

ついでにマクロにしよう (2012.01.15追記)

 上記の式を #define で仮引数付きマクロ _DIVUP() にしてみました。
 _UNSAFE_DIVUPはゼロ割に対応していません。(vWaruがゼロだとヤバい)

1.
2.
3.
// ====== vWaruがゼロのときゼロを返す
#define _DIVUP(vWarareru, vWaru)        ( !(vWaru) ? 0u : _UNSAFE_DIVUP( vWarareru, vWaru ) )
#define _UNSAFE_DIVUP(vWarareru, vWaru) ( ( (vWarareru) + ( (vWaru) - 1u) ) / (vWaru) )
このコードは CodePublisher で生成しています

[2012.01.15] 上記の式が正しいことを、100000*100000回の試験にて確認しました

 

[番外] ダメな例

 ググるとよく見かけるダメな例です。

1.
2.
3.
4.
5.
6.
    unsigned int    myWaruKazu      = 5u;   // 割る数
    unsigned int    myWarareruKazu  = 6u;   // 割られる数
    unsigned int    myResult;               // 結果
‌ 
    // ====== 割り算結果に[0.9]を足せば切り上げられるかも?
    myResult    =  (unsigned int)( (double)myWarareruKazu / (double)myWaruKazu + 0.9);
このコードは CodePublisher で生成しています

 怪しいニオイがプンプンしていますが、一応検証してみました。

 ◆0~50までの割り算結果

 1/11  = 0 (期待値は1)
 1/12  = 0 (期待値は1)
 1/13  = 0 (期待値は1)
 .
 .
 .
 45/11 = 4 (期待値は5)
 45/22 = 2 (期待値は3)
 .
 .

 207個のダメなパターンがありました。doubleを使ったコスパが悪い式のくせに、ダメパターンもあるとは、、これ如何に。
 要は、割り算結果の小数点桁が0.1未満になるとアウトです。0.9を足しても切り上げられないからです。

 「じゃあ0.99999..を足すわ」、というアイディアは、、、まあ、、いいと思いますよ。どうでも。
 

コメント

  • コメントはまだありません。

コメントを投稿する

コメントを投稿する場合は以下に注意してください。

・記事に関係する内容であること
・特別な理由がない限り「全体公開」であること

これさえ守っていただければどんな内容でも投稿可能です。
皆様の質問やコメントは他の方の問題解決に繋がりますのでご協力ください。

コメント投稿フォーム
名前
メール
URL
コメント
閲覧制限

コメントを投稿するには、以下の問題に答えてください。
問題:「voltageの和訳を漢字二文字で入力してください」