2017-06-08 6 views
-1

以下のsprinfの動作は非常に奇妙です。PHP sprintf( '%d'、floatval('16 .40 ')* 100)は1639を出力しますか?

// The code below outputs 1639 
$value = floatval('16.40') * 100; 
echo sprintf('%d', $value); 

しかし、私はそれが私が$valueをダンプ1640.000000

を出力%fを使用する場合、それは間違いなくfloat(1640)です。

誰でも私が%dを使用したときに何が起こったのか知っていますか?これはPHPのバグですか?私はPHP7でテストしました。

+1

[PHP - 浮動小数点数の精度]の可能な複製(https://stackoverflow.com/questions/3726721/php-floating-number-precision) –

答えて

3

変数$valueには浮動小数点数が含まれています。浮動小数点数は正確ではなく、近似値です。

$valueの値が1640しかし1639.99999999999977262632ありません。 %fを使用して印刷する場合、printf()は小数点以下を小数点以下の桁数に丸めます。小数点以下は切り捨てられます。1640.000000です。

printf()$valueの整数部のみを使用し、%dで印刷し、それが1639です。文字列として値を取得するためにnumber_format()を使用して、より良い、

printf('%d', round($value, 0)); 

または::

使用round()

は正しい整数値を取得する

echo(number_format($value, 0, '', '')); 

印刷1640両方を。


1/3と考えてください。近似的には0.3333333333ですが、小数点の後に3という無限の数があるため、正確に表現できません。数学では、3 * 1/3 = 1実際の生活(およびコンピュータ)では、3の小数点を何度入れても、3 * 0.333333333は決して1になりません。コンピュータプログラムは通常、小数点以下の桁数に値を丸め、最終的には1と表示されますが、これは必ずしも発生しません。

これが発生しない場合、別のquestion similar to this oneがStackOverflowでポップアップします。

+0

ありがとうございます!今はかなり明確です。 – Jonathan

関連する問題