当我在PHP中进行以下乘法时:
$ret = 1.0 * 0.000000001;
我得到了结果:1.0E-9
我想将此结果转换为普通的十进制表示法,我该怎么做?
sprintf('%f',$ret)
不起作用,返回0.000000
。溢出?
答案 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
,因为您的问题仅适用于显示目的。尊重语言环境可以提供更好的用户体验。