整数の除算を切り上げる信頼性の高い方法
整数の除算はデフォルトでゼロに向かって丸められるため、問題が発生する可能性があります。常に切り上げられるようにするには、より良いソリューションが必要です。
この記事で提供されている例では、オペランドを倍精度浮動小数点数に変換し、Math.Ceiling()
を使用することが回避策として考えられますが、これは非標準で非効率的であると考えられます。
次の方法をお勧めします:
1. 仕様を明確に定義する
2. テスト可能なアルゴリズムを設計する
問題を小さなステップに分割します:
3. ソリューションを実装します
次に実装例を示します:
<code class="language-java">public static int DivRoundUp(int dividend, int divisor) { if (divisor == 0) throw new IllegalArgumentException("除数为零"); if (divisor == -1 && dividend == Integer.MIN_VALUE) throw new ArithmeticException("整数溢出"); int quotient = dividend / divisor; boolean dividedEvenly = (dividend % divisor) == 0; if (dividedEvenly) return quotient; boolean roundedDown = ((divisor > 0) == (dividend > 0)); return roundedDown ? quotient + 1 : quotient; }</code>
このアルゴリズムは、割り切れないすべての除算結果を切り上げるという指定された動作に準拠しています。オーバーフローやゼロ除算エラーもうまく処理します。これは最もエレガントな解決策ではありませんが、明確でテスト可能で正しいものです。
以上が整数の除算が常に切り上げられるようにするにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。