現在の位置: ホーム> 最新記事一覧> PHPの小数点の丸めを避けるためのヒント

PHPの小数点の丸めを避けるためのヒント

gitbox 2025-06-27
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// コードのこの部分は、記事の内容とは何の関係もありません,例としてのみ</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"この記事を読んでください!"</span></span><span>;
</span><span><span class="hljs-meta">?&gt;</span></span><span>

&lt;hr&gt;

存在する PHP で使用されます </span><span><span class="hljs-title function_ invoke__">floor</span></span><span>() 小数点の丸めエラーを回避する機能のためのヒント

存在する进行数值计算时,特に小数点を含む丸め操作,PHP 組み込み関数 </span><span><span class="hljs-title function_ invoke__">round</span></span><span>() 時々、それは浮動小数点数の精度が原因です,結果は満足のいくものではありません。例えば,価格が必要なとき、金利などのデータを処理する場合,</span><span><span class="hljs-title function_ invoke__">round</span></span><span>() 不正確な結果が生成される場合があります,これは、プログラムのロジックと最終出力に影響します。

</span><span><span class="hljs-comment">## よくある質問</span></span><span>

PHP 浮動小数点精度制限,のような原因 </span><span><span class="hljs-number">1.005</span></span><span> そのような数 </span><span><span class="hljs-title function_ invoke__">round</span></span><span>() 処理するとき,予想される </span><span><span class="hljs-number">1.01</span></span><span>,しかし、結果はそうかもしれません </span><span><span class="hljs-number">1.00</span></span><span>。这是因为浮点数存在する计算机内部是以二进制形式存储的,多くの小数点以下数を正確に表現することはできません,エラーを引き起こします。

```php
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">round</span></span><span>(</span><span><span class="hljs-number">1.005</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>); </span><span><span class="hljs-comment">// 出力 1</span></span><span>
</span></span>

フロア()を使用して、丸めエラーを避けます

フロア()関数は下方に丸められています。丸めのようには聞こえませんが、数値を適切に増幅して調整すると、「最も近い下限にとどまる」という効果を達成して、浮動小数点数の丸めによるエラーを回避できます。

実装方法

  1. 2つの小数桁を保持するなど、対応する小数桁に数値を増幅し、100回拡大します。

  2. フローティングポイントエラーを避けるために、拡大した数値に小さなオフセット値(0.00001など)を追加します。

  3. floor()を使用して丸めます。

  4. 元のサイズに縮小します。

サンプルコード:

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">floor_round</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$number</span></span></span><span>, </span><span><span class="hljs-variable">$precision</span></span><span> = </span><span><span class="hljs-number">2</span></span><span>) {
    </span><span><span class="hljs-variable">$multiplier</span></span><span> = </span><span><span class="hljs-title function_ invoke__">pow</span></span><span>(</span><span><span class="hljs-number">10</span></span><span>, </span><span><span class="hljs-variable">$precision</span></span><span>);
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">floor</span></span><span>(</span><span><span class="hljs-variable">$number</span></span><span> * </span><span><span class="hljs-variable">$multiplier</span></span><span> + </span><span><span class="hljs-number">0.00001</span></span><span>) / </span><span><span class="hljs-variable">$multiplier</span></span><span>;
}

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">floor_round</span></span><span>(</span><span><span class="hljs-number">1.005</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>); </span><span><span class="hljs-comment">// 出力 1.00,ただし、より正確な結果を達成するためのニーズに応じてオフセット値を調整できます</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">floor_round</span></span><span>(</span><span><span class="hljs-number">1.2349</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>); </span><span><span class="hljs-comment">// 出力 1.23</span></span><span>
</span></span>

注記

  • オフセット値のサイズは、実際のデータの範囲に従って調整する必要があります。

  • 厳密な丸め効果が必要な場合は、BCMATHやGMPなどのマルチエキシジー数学拡張機能を使用することをお勧めします。

  • Floor()は、「丸め」に主に適しています。これは、「複数の丸め」または「複数の」シナリオを避けるのに役立ちます。

要約します

フロア()関数を倍率と小さなオフセット値と組み合わせて使用​​すると、フローティングポイント数を丸めることによって引き起こされるエラーを効果的に回避できます。これは、財務データまたは計量データを扱うときの実用的なトリックです。浮動小数点数の基礎となるメカニズムを理解し、機能とアルゴリズムを合理的に選択すると、PHPプログラムがより安定して信頼性を高めることができます。

 <span><span><span class="hljs-comment">// エンディングは記事の内容とは関係ありません</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"読んでくれてありがとう,さようなら!"</span></span><span>;
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>