4

PHPでround()関数がどのように機能するかを誤解していない限り、バグがあると思います。

例:

ランニング:

$prod = 201.6 * 0.000275;  
echo "No Round..: " . $prod;  
echo "With Round: " . round($prod, 2, PHP_ROUND_HALF_DOWN);  

PHPの戻り値:

No Round..: 0.05544  
With Round: 0.06

私が期待すること:
ラウンドでは、結果として0.05を期待しました。この期待される結果は正しいですか?

環境:
Apache2.2.17を搭載したWindows764ビットで実行されているPHP5.3.4。

たくさんTnks。

4

2 に答える 2

9

それが正しい期待される結果です。

PHP_ROUND_HALF_DOWN値がちょうど半分の場合にのみ機能します。この場合、0.055 になります。

0.055 を超えるもの。0.0550000001 は 0.06 になります。

切り捨てたい場合は、 を試してくださいfloor()

<?php
$prod = 201.6 * 0.000275;

$prod = floor($prod * 100)/100;

echo $prod; // gives 0.05
于 2012-07-23T07:59:12.283 に答える
1

これは、PHP がオーバーフローを追跡しないためです。

たとえば、次も試してください

print (int) ((0.1 + 0.7) * 10);

式は 8 を返すと予想しますが、代わりに7を出力します。これは、単純な算術式の結果が8ではなく7.999999として内部的に格納され、PHP が数値を int にキャストするときに、小数部分が単純に切り捨てられるために発生します。これは、12.5% のエラーを意味します。

正確な計算が必要な場合は、代わりにBCMath拡張機能を使用してください。

Zend PHP 5 Certification Study Guide (php|architect) の「PHP の基本」の章を参照してください。

于 2012-07-23T08:00:09.783 に答える