PHPで次の乗算を行うと:
$ret = 1.0 * 0.000000001;
結果が出ます:1.0E-9
この結果を通常の10進表記に変換したいのですが、どうすればよいですか?
sprintf('%f',$ret)
動作しません、それは戻ります0.000000
。オーバーフロー?
PHPで次の乗算を行うと:
$ret = 1.0 * 0.000000001;
結果が出ます:1.0E-9
この結果を通常の10進表記に変換したいのですが、どうすればよいですか?
sprintf('%f',$ret)
動作しません、それは戻ります0.000000
。オーバーフロー?
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
これがお役に立てば幸いです。
精度指定子を追加する必要があります(浮動小数点数に対して表示される小数点以下の桁数)。このようなもの:
echo sprintf('%.10f',$ret); // 0.0000000010
指定する番号がわからない場合は、大きな番号を付けて、と組み合わせてrtrim()
ください。
echo rtrim(sprintf('%.20f', $ret), '0'); // 0.000000001
上記のコード0
は、文字列の末尾から任意のを削除します。
10進数で計算する場合は、精度を高めるためにBCMathを使用することをお勧めします。それはあなたが実際にあなたが望む結果を得るのを確実にします。
必要なものを印刷するには、精度を指定してを使用する必要があります%.9f
。これは、デフォルトで6つの10進数が表示されるためです。それはそれをこのようなものにします(bsdnoobzがすでに言ったように):
sprintf('%.9f',$ret);
システムの設定と制限に合わせるために、serialize_precision
可能な限り最も正確な結果を取得するために使用できます。
echo rtrim(sprintf('%.'.ini_get('serialize_precision').'f', $ret));
%F
質問は表示目的でのみ意味があるため、ロケールに対応していないものを使用することはお勧めしません。ロケールを尊重することで、UXが向上します。