【发布时间】:2025-12-19 15:50:06
【问题描述】:
在 PHP 中我有以下代码:
<?PHP
$var = .000021;
echo $var;
?>
输出为 2.1E-5 !
为什么?它应该打印 .000021
【问题讨论】:
标签: php syntax formatting numbers
在 PHP 中我有以下代码:
<?PHP
$var = .000021;
echo $var;
?>
输出为 2.1E-5 !
为什么?它应该打印 .000021
【问题讨论】:
标签: php syntax formatting numbers
【讨论】:
如果您想看到预期的数字,请使用 number_format 或 sprintf。
echo sprintf('%f', $var);
echo number_format($var, 6);
【讨论】:
echo sprintf() 是一个“反模式”。绝对没有任何理由让任何人出于任何原因在任何代码中写入echo sprintf()——每次都应该是printf()。
要显示最多 8 个小数位的数字,右侧没有多余的零(就像 number_format 所做的那样,这可能很烦人),请使用以下命令:
echo rtrim(rtrim(sprintf('%.8F', $var), '0'), ".");
【讨论】:
2.1E-5 是与 0.000021 相同的数字。这就是它打印低于 0.001 的数字的方式。如果您需要特定格式,请使用 printf()。
编辑如果您不熟悉 2.1E-5 语法,您应该知道它是 2.1×10-5 的简写。这是大多数编程语言用科学计数法表示数字的方式。
【讨论】:
之前的答案对 OP 问题作出了回应,但没有人提供执行此操作的代码。
使用此功能可以格式化任何具有 E- 格式的数字。
function format_amount_with_no_e($amount) {
$amount = (string)$amount; // cast the number in string
$pos = stripos($amount, 'E-'); // get the E- position
$there_is_e = $pos !== false; // E- is found
if ($there_is_e) {
$decimals = intval(substr($amount, $pos + 2, strlen($amount))); // extract the decimals
$amount = number_format($amount, $decimals, '.', ','); // format the number without E-
}
return $amount;
}
请注意该函数将始终返回一个字符串。
【讨论】:
一般来说,数字是数字,而不是字符串,这意味着任何编程语言都将数字视为数字。因此,数字本身并不意味着任何特定格式(例如使用.000021 而不是2.1e-5)。这与显示带有前导零的数字(如0.000021)或对齐数字列表没有什么不同。这是您在任何编程语言中都会发现的普遍问题:如果您需要特定格式,则需要使用您的编程语言的格式函数来指定它。
当然,除非您将数字指定为字符串并在需要时将其转换为实数。有些语言可以隐式地做到这一点。
【讨论】:
编程语言有不同的方法将数字存储在内存中。这取决于正在使用的号码类型。在您的情况下,您有一个浮点数(分数),它太大而无法存储为定点数(分数根据它们的大小以这种方式存储)。
这是一个非常重要的功能,尤其是在处理非常大或非常小的数字时。例如,NASA 或 spaceX 使用特殊的存储方法进行计算,以确保重新进入地球轨道的火箭降落在它们应该降落的地方。
此外,不同的存储方法占用的内存量也不同。但是,上面提供的解决方案应该可以工作。请记住,非常大或小的数字可能会发生舍入错误。
【讨论】:
你可以使用浮点数
$var = '122.34343The';
echo floatval($var); // print 122.34343
对于 int 你可以使用
echo intval(42000000); // 42000000
【讨论】: