PHP開発中、多くの場合、浮動小数点数を丸める必要があり、 CEIL()関数は最も一般的に使用される方法です。その機能は、シル(2.3)の結果(2.3)の結果(-2.3)の結果が-2であるなど、最も近い整数まで数値を締めくくることです。しかし、 1.2E3 (すなわち1200 )や5.678E-4 (つまり0.0005678 )などの科学的表記で表現された浮動小数点数を扱っている場合、 CEIL()機能はまだ安定して信頼できるものですか?
PHPでは、科学表記は浮動小数点表現法です。 1.2E3は1.2 * 10^3 、つまり1200を意味します。これは、特に金融、科学、または一部のサードパーティAPIによって返されるデータを扱う場合、多数または小数を表す非常に一般的な方法です。
<?php
echo 1.2e3; // 出力 1200
echo "\n";
echo 5.678e-4; // 出力 0.0005678
?>
ceil()関数は、数値を「切り上げる」ことです。数が正であろうと負であろうと、「より大きな整数」の方向に回ります。
<?php
echo ceil(2.3); // 出力 3
echo ceil(-2.3); // 出力 -2
?>
それが受け入れるパラメーターはフロートタイプであり、フロートは基本的にIEEE 754ダブルエシジョンフローティングポイント番号であるため、 ceil()内の動作はフローティングポイント数の精度制限に依存します。
CEIL()を直接使用して、科学表記法の形で数値を処理できます。
<?php
echo ceil(1.2e3); // 出力 1200
echo "\n";
echo ceil(5.678e-4); // 出力 1,結果があるからです 0.0005678,ceil それからそれはなります 1
?>
科学表記法の下では、 ceil()の動作は正常であることがわかります。なぜなら、下部では、 1.2E3が実際にPHPインタープリターによって1200.0のフロートタイプとして処理されているためです。
しかし、問題の鍵は、 CEIL()の実装ではなく、浮動点の精度の制限です。たとえば、非常に小さい科学表記値または非常に大きな科学表記値を扱う場合、 ceil()は、浮動ポイントエラーのために予期しない結果につながる可能性があります。
<?php
$val = 1.0000000000000001e0; // これは非常に近いです 1 フローティングポイント番号
echo ceil($val); // 出力 1
$val2 = 0.9999999999999999e0; // これはわずかに小さくなっています 1 フローティングポイント番号
echo ceil($val2); // 出力 1,理論的にはそうあるべきですが 1,しかし、実際の値は定かではありません
?>
上記の例は、 ceil()自体がロジックに問題がない場合でも、浮動小数点数の実際のストレージがその出力に影響を与える可能性があることを示しています。浮動小数点数の表現を詳細に分析するM66.netに関する記事があります: https://m66.net/articles/php-floating-point-precision
CEIL()を使用して科学表記を処理するときにエラーを回避するために、次の戦略を採用できます。
手動でフォーマットフローティングポイント番号: sprintf()またはnumber_format()を使用して、精度が妥当な範囲内にあることを確認します。
判断精度の境界:重大な値(整数境界に近い浮動小数点数など)を扱うときに、過失耐性の判断を追加します。
BCMATHまたはGMP拡張機能を使用します。高精度のコンピューティングシナリオの場合、これらの拡張機能はフロート操作を組み込んでいないのではなく、推奨されます。
外部データの標準化:たとえば、APIによって返される科学表記データは、さらに処理する前に文字列に変換されます。
全体として、 CEIL()関数はPHPで信頼性が高く、通常、科学的表記で表される数字を扱う場合、間違いはありません。しかし、問題はしばしば、浮動小数点数自体の精度にあります。したがって、精度を含むシナリオを扱う場合、開発者はそれにもっと注意を払い、データ範囲を合理的に制御し、高精度ライブラリを使用して、必要に応じて結果の正確性を確保する必要があります。