22

文字列 (バイト単位のサイズ) のリストがあり、それらをファイルから読み取ります。文字列の 1 つが 2968789218 だとしますが、それを float に変換すると 2.00 になります。

これはこれまでの私のコードです:

$string = "2968789218";
$float = (float)$string;
//$float = floatval($string);
//the result is same
// result 2.00

誰?

解決済み

問題は実際にはエンコーディングでした。ファイルのエンコーディングを変更しても問題ありません:D

4

4 に答える 4

21

驚くべきことに、受け入れられた答えはありません。この問題は 32 ビット PHP にのみ存在します。

ドキュメントから、

文字列に '.'、'e'、'E' のいずれの文字も含まれず、数値が整数型の制限 (PHP_INT_MAX で定義) に収まる場合、文字列は整数として評価されます。それ以外の場合はすべて、float として評価されます。

つまり、$stringは最初に INT として解釈され、オーバーフローが発生します ($string2968789218PHP_INT_MAXは、 32 ビット PHPの最大値 ( ) である2147483647(float)を超えます)。次に、またはによって float と評価されfloatval()ます。

したがって、解決策は次のとおりです。

$string = "2968789218";
echo 'Original: ' . floatval($string) . PHP_EOL;
$string.= ".0";
$float = floatval($string);
echo 'Corrected: ' . $float . PHP_EOL;

出力:

Original: 2.00
Corrected: 2968789218

PHP が 32 ビットか 64 ビットかを確認するには、次の方法があります。

echo PHP_INT_MAX;

PHP が 64 ビットの場合は が出力され9223372036854775807、それ以外の場合は が出力され2147483647ます。

于 2014-06-03T15:13:13.390 に答える
5

使ってみて

$string = "2968789218";
$float = (double)$string;
于 2013-05-12T18:24:23.693 に答える
0

関数 floatval が機能しない場合は、次のようにしてみてください。

    $string = "2968789218";
    $float = $string * 1.0;
    echo $float;

しかし、私にとっては、以前の回答はすべてうまくいきました ( http://writecodeonline.com/php/で試してみてください)。サーバーに問題があるのではないでしょうか?

于 2013-05-13T03:08:21.090 に答える