20

当我在 PHP 中进行以下乘法运算时:

$ret = 1.0 * 0.000000001;

我得到结果:1.0E-9

我想将此结果转换为正常的十进制表示法,我该怎么做?

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(四百万):

$ 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

这是九位数字,所以你需要这样写:

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字符串末尾的任何 's。

于 2012-06-06T14:52:11.370 回答
4

I suggest the use BCMath for more accuracy when you are calculating with decimal numbers. That makes sure that you actually get the results you want.

To print what you want, you should specify the precision and use %.9f, since it defaults to displaying 6 decimal numbers. That makes it something like this (just like bsdnoobz already said):

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

为了与系统的设置和限制保持一致,您可以使用serialize_precision以获得最准确的结果。

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

我不建议使用非语言环境感知%F,因为您的问题仅对显示目的有意义。尊重语言环境可以带来更好的用户体验。

于 2013-02-13T16:11:01.813 回答