20

PHPで次の乗算を行うと:

$ret = 1.0 * 0.000000001;

結果が出ます:1.0E-9

この結果を通常の10進表記に変換したいのですが、どうすればよいですか?

sprintf('%f',$ret)動作しません、それは戻ります0.000000。オーバーフロー?

4

4 に答える 4

36

sprintf('%f',$ret)動作しません、それは戻ります0.000000。オーバーフロー?

sprintf動作しますが、ここでいくつかのポイントを逃します。

0.000000オーバーフローしません。修飾子の場合、デフォルトで6桁を使用するsprintfだけです。%fまた%f、ロケールを認識していることに注意してください%F。おそらくより適しています。

より多くの桁を使用したい場合があります。たとえば、4 000 000(400万)としましょう。

$ php -r "printf('%.4000000F', 1*0.000000001);"

Notice: printf(): Requested precision of 4000000 digits was truncated to PHP maximum of 53 digits in Command line code on line 1

Call Stack:
    0.0001     319080   1. {main}() Command line code:0
    0.0001     319200   2. printf() Command line code:1

0.00000000100000000000000006228159145777985641889706869

この例が示すように、共通の値(6桁)だけでなく、最大値(おそらく、PHPが実行されるコンピューターシステムによって異なります)もあります。ここでは、警告が示すように、53桁に切り捨てられます。

あなたの質問のために、私はあなたが表示したいと思います:

0.000000001

これは9桁なので、次のように記述する必要があります。

sprintf('%.9F',$ret)

ただし、これを行うことをお勧めします。

rtrim(sprintf('%.20F', $ret), '0');

これにより、後で右からゼロが削除されます。

0.000000001

これがお役に立てば幸いです。

于 2012-06-06T15:36:09.903 に答える
7

精度指定子を追加する必要があります(浮動小数点数に対して表示される小数点以下の桁数)。このようなもの:

echo sprintf('%.10f',$ret);  // 0.0000000010

指定する番号がわからない場合は、大きな番号を付けて、と組み合わせてrtrim()ください。

echo rtrim(sprintf('%.20f', $ret), '0');  // 0.000000001

上記のコード0は、文字列の末尾から任意のを削除します。

于 2012-06-06T14:52:11.370 に答える
4

10進数で計算する場合は、精度を高めるためにBCMathを使用することをお勧めします。それはあなたが実際にあなたが望む結果を得るのを確実にします。

必要なものを印刷するには、精度を指定してを使用する必要があります%.9f。これは、デフォルトで6つの10進数が表示されるためです。それはそれをこのようなものにします(bsdnoobzがすでに言ったように):

sprintf('%.9f',$ret);
于 2012-06-06T14:57:05.683 に答える
3

システムの設定と制限に合わせるために、serialize_precision可能な限り最も正確な結果を取得するために使用できます。

echo rtrim(sprintf('%.'.ini_get('serialize_precision').'f', $ret));

%F質問は表示目的でのみ意味があるため、ロケールに対応していないものを使用することはお勧めしません。ロケールを尊重することで、UXが向上します。

于 2013-02-13T16:11:01.813 に答える