在PHP中将指数形式的数字转换为十进制

3

我有一个用科学计数法表示的浮点数,例如4.1595246940817E-17,我想将其转换为十进制数,如2.99等。

非常感谢您的帮助。

format_number()sprintf()似乎对我无效。


指数或小数只是显示数字的可读形式的方式。 - ssice
1
我无法弄清楚2.99来自何处(您可能希望告诉我们您真正的期望),但是您是否期望__number_format(4.1595246940817E-17, 2)__生成__4.15__?如果是这样,那么您的计算结果将会偏差很多个数量级(正确的结果应该是__0.00__)。 - GZipp
是的,我期望4.1595246940817E-17能够生成2.99。这是我的情况。分配大小:65536字节= 65536/1024 = 64KB。分配单元:49107。总大小= 49107 * 64 = 3142848KB = 3069.18MB = 2.99GB。 - Saqib
这是我的代码<pre><code><?php $au = 65536; //分配单元大小(字节) $auk = $au / 1024; //分配单元大小(KB)$totalSize = (49107*$auk)/(1024*1024);echo $totalSize; ?></code></pre> 这将会输出2.99,但如果我从注册表/SNMPtrap 等获取实时值,则会输出4.1595246940817E-17。 - Saqib
那跟你的问题完全不同。请尝试下面 ajreal 和 Russell Dias 给出的解决方案。 - GZipp
4个回答

4

是的,我期望4.1595246940817E-17能够生成2.99。这是我的情况。分配大小:65536字节= 65536/1024 = 64KB。分配单元:49107。总大小= 49107 * 64 = 3142848KB = 3069.18MB = 2.99GB。 - Saqib
@user544836 - 这是数学问题吗?如果是,尝试使用math扩展;如果不是,我不确定还能做些什么。 - ajreal
@Saqib - 我明白了,你应该这样做 php -r "echo 49107*64/1024/1024;",预设 Gb 而不是让它溢出... - ajreal

1
您可以移除小数点($x 为您的数字):
$strfloat = strtolower((string)($x));
$nodec = str_replace(".", "", $x);

然后提取指数部分。

list($num, $exp) = explode("e", $nodec);
$exp = intval($exp);

然后你有小数和数字,所以你可以进行格式化:

if($exp < 0) return "0." . ("0" * -($exp + 1)) . $num;
if($exp == 0) return (string)$x;
if($exp > 0) return $num . ("0" * $exp);

这并不增加精度,只是多了一些零。


1
使用BC Math库,您可以bcscale()将数字缩放到预定的小数位数,这将为需要算术精度的未来计算设置参数。
bcscale(3);
echo bcdiv('105', '6.55957'); // 16.007

1
这是一个使用 BC Math 的解决方案,由 ajreal 和 Russell Dias 建议:
$au = 65536; 
$auk = bcdiv($au, 1024);
$totalSize = bcdiv(bcmul(49107, $auk), bcpow(1024, 2), 2); 
echo $totalSize . "\n"; 

// echos 2.99

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接