显示浮点值,不含科学记数法

2022-08-30 20:28:06

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

$ret = 1.0 * 0.000000001;

我得到的结果:1.0E-9

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

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


答案 1

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

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

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

但是,您可能希望执行以下操作:

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

这将在之后从右侧删除零:

0.000000001

希望这是有帮助的。


答案 2

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

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

如果您不知道应该指定哪个数字,只需给它一个大数字并将其与.rtrim()

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

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


推荐