显示没有科学记数法的浮点值

时间:2012-06-06 14:49:29

标签: php floating-point

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

$ret = 1.0 * 0.000000001;

我得到了结果:1.0E-9

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

sprintf('%f',$ret)不起作用,返回0.000000。溢出?

4 个答案:

答案 0 :(得分:31)

  

sprintf('%f',$ret)不起作用,返回0.000000。溢出?

sprintf有效,但是你错过了一些观点。

0.000000没有溢出。只是sprintf修饰符的%f默认使用6位数。另请注意,%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

希望这有用。

答案 1 :(得分:7)

您需要添加精度说明符(浮点数应显示多少个十进制数)。像这样:

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

如果你不知道你应该指定什么号码,只需给它一个大号并将其与rtrim()结合起来。

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

上面的代码将从字符串的末尾删除任何0

答案 2 :(得分:4)

当您使用十进制数进行计算时,我建议使用BCMath以获得更高的准确性。这可以确保您实际获得所需的结果。

要打印您想要的内容,您应指定精度并使用%.9f,因为它默认显示6个十进制数字。这就像这样(就像bsdnoobz已经说过的那样):

sprintf('%.9f',$ret);

答案 3 :(得分:3)

要符合您系统的设置和限制,您可以使用serialize_precision来获得最准确的结果。

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

我不建议使用非区域设置感知%F,因为您的问题仅适用于显示目的。尊重语言环境可以提供更好的用户体验。