web-dev-qa-db-ja.com

PHP整数に丸める

数値を丸めたいのですが、配列キーとして使用したいので、適切な整数が必要です。頭に浮かぶ最初の「解決策」は次のとおりです。

_$key = (int)round($number)
_

ただし、これが常に機能するかどうかはわかりません。私が知る限り、_(int)_は小数点以下を切り捨てるだけであり、round($number)は理論的に制限された精度の浮動小数点数を返すため、round($number)が7.999999のようなものを返す可能性があります...次に_$key_は8ではなく7ですか?

この問題が実際に存在する場合(それをテストする方法がわからない)、どうすれば解決できますか?多分:

_$key = (int)(round($number) + 0.0000000000000000001) // number of zeros chosen arbitrarily
_

これより良い解決策はありますか?

14
AndreKR

フロートを適切に丸めるには、以下を使用できます。

これらの関数は浮動小数点数を返しますが、- Niet the Dark Absolコメント "から、浮動小数点数に格納された整数は常に正確で、最大で約2 ^ 51です。これは、とにかくintに格納できます。 "

20
Mistalis

round()、精度を設定しない場合、常に最も近い整数に丸められます。デフォルトでは、小数点以下の桁数はゼロに丸められます。

そう:

_$int = 8.998988776636;
round($int) //Will always be 9

$int = 8.344473773737377474;
round($int) //will always be 8
_

したがって、これを配列のキーとして使用することが目的の場合は、これで問題ありません。

もちろん、モードと精度を使用して、round()の動作を正確に指定できます。 this を参照してください。

[〜#〜]更新[〜#〜]

あなたは実際には intval にもっと興味があるかもしれません:

_echo intval(round(4.7)); //returns int 5
echo intval(round(4.3)); // returns int 4
_
2
Zac Brown

Float内に格納された整数は常に正確で、最大253とにかく、これはintに格納できる以上のものです。私は何も心配していません。

0
AndreKR

Intにキャストする前に単に1/2を追加するのはどうですか?

例えば:

$int = (int) ($float + 0.5);

これにより、予測可能な結果が得られます。

0
Chris Seufert