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

Joh*_*hni 14 php floating-point

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

$ret = 1.0 * 0.000000001;
Run Code Online (Sandbox Code Playgroud)

我得到的结果是:1.0E-9

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

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

hak*_*kre 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
Run Code Online (Sandbox Code Playgroud)

正如这个例子所示,不仅有一个共同的值(6位),而且还有一个最大值(可能取决于PHP执行的计算机系统),在我的情况下截断到53位,如警告所示.

因为你的问题,我想说你要显示:

0.000000001
Run Code Online (Sandbox Code Playgroud)

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

sprintf('%.9F',$ret)
Run Code Online (Sandbox Code Playgroud)

但是,您可能希望这样做:

rtrim(sprintf('%.20F', $ret), '0');
Run Code Online (Sandbox Code Playgroud)

这将从之后删除右边的零:

0.000000001
Run Code Online (Sandbox Code Playgroud)

希望这是有帮助的.

  • `rtrim(sprintf('%.20F', $ret), '0')` 将返回 `0.` 如果 `$ret` 为零。像这样修复它:`abs($x) < 1e-20 ? '0' : rtrim(sprintf('%.20f', $x), '0');` (2认同)

flo*_*ree 7

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

echo sprintf('%.10f',$ret);  // 0.0000000010
Run Code Online (Sandbox Code Playgroud)

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

echo rtrim(sprintf('%.20f', $ret), '0');  // 0.000000001
Run Code Online (Sandbox Code Playgroud)

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