PHPプログラミングでは、特にページング、価格計算、バッチ処理などのシナリオで、Floating Point数を上向きに丸めるために、 CEIL()関数がよく使用されます。ただし、部門操作で使用される場合、小数が厳密に処理されていない場合、検出不可能な論理エラーを引き起こす可能性があります。この記事では、この一般的な誤解とその解決策を掘り下げます。
合計95個のデータを使用して、ページごとに10個のデータを表示するページングシステムを想像してください。ページの総数を計算する典型的な方法は次のとおりです。
<code> $ stolyitems = 95; $ itemsperpage = 10; $ totalpages = ceil($ stolyitems / $ itemsperpage); Echo $ TotalPages; //出力:10 </code>この簡単な例では、出力は正しいです。ただし、ユーザーの入力や外部APIなど、 $ totherItemsの値ソースが不確かになった場合、または整数除算の結果を使用すると、問題が発生する可能性があります。
例えば:
<code> $ stolyitems = intval( "95.4"); //エラーによって95として処理されます$ itemsperpage = 10; $ totalpages = ceil($ stolyitems / $ itemsperpage); //実際の期待は10ページですecho $ totalpages; //実際の出力:10 </code>この結果は正しいですが、合計が94.1であると仮定すると、整数にキャストすると、1つのカウントが少なくなります。
<code> $ stolyitems = intval( "94.1"); // 94 $ TOTALPAGES = CEIL($ stolyItems / 10)として処理されます。 // ceil(9.4)=> 10 </code>たとえば、押し下げ続けると、他の計算に頼って小数を取得しますが、分割結果を浮動小数点数に明示的に変換しません。
<code> $ stolyitems = 94; $ itemsperpage = 10; $ totalpages = ceil($ stolyitems / $ itemsperpage); // ceil(9.4)=> 10 </code>ここでは、正しい結果はまだ出力されています。ただし、代わりに除数を使用する場合:
<Code> $ TotalPages = ceil(intdiv($ totalitems、$ itemsperpage)); // intdiv(94、10)=> 9 </code>intdiv()が小数部分を直接破棄し、丸みを帯びた結果とceil()がその意味を失ったため、この結果は間違っています。
多くの開発者は、 CEIL()を使用している限り、結果は正しい必要があり、入力CEIL()が正確な浮動小数点数でなければならないことを無視すると考えています。分割プロセスの特定の部分が分割されるか、中間結果がタイプ変換のために小数点以降に破棄されると、 CEIL()が間違った入力に基づいて実行される場合があります。
さらに、一部のデータベースは文字列である場合に結果を返しますが、PHPはデフォルトで変換するときにエラーが発生します。
<code> $ result = "94.8"; // database = ceil($ result / 10)から取得した文字列$ totalpages; //フローティングポイント番号に自動的に変換しますが、フォーマットが正しいことを確認してください</code>結果がコンマ分離された小数(ヨーロッパ形式)を使用するなどの標準以外の形式で処理される場合、フローティングポイント番号に正しく変換されず、これがCEIL()の出力に影響します。
上記の問題を回避するために、推奨されるアプローチは、タイプと精度を明示的に処理して、CEIL()が正確な浮動ポイント値を受信することを確認することです。
使用(フロート)キャスト:
<code> $ totalpages = ceil((float)$ stolyitems /(float)$ itemsperpage);
</code>
intdiv()とceil()を使用して混合しないでください。整数部門を使用する必要がある場合は、残りに基づいて判断することをお勧めします。
<code> $ TotalPages = intdiv($ stolyitems、$ itemsperpage);
if($ totheritems%$ itemsperpage> 0){
$ TotalPages += 1;
}
</code>
ユーザーまたはAPIからの入力については、以下など、 intval()の代わりにfloatval()を使用することをお勧めします。
PHPのCEIL()関数を使用する場合、小数が分割で適切に処理されていない場合、論理エラーを引き起こすのは非常に簡単です。特にロジックのページングやカウントでは、結果は「ほぼ正しい」ように見えるかもしれませんが、実際の精度の脆弱性があります。
開発者は、暗黙の型変換と整数部門のtrapに慎重であり、データ型に敏感であり、明示的な変換と合理的な判断を通じてプログラムロジックの厳密さと正確性を確保する必要があります。