当我指定为.000021时,为什么PHP用科学计数法打印我的数字?

ncgqoxb0  于 2023-05-05  发布在  PHP
关注(0)|答案(8)|浏览(189)

在PHP中,我有以下代码:

<?PHP
  $var = .000021;
  echo $var;
?>

输出为2.1E-5!
为什么?它应该打印.000021

cygmwpex

cygmwpex1#

使用number_format()来获得你想要的:

print number_format($var, 5);

同时检查sprintf()

bpzcxfmw

bpzcxfmw2#

2.1E-5 * 是 * 与0.000021相同的数字。这就是它如何打印小于0.001的数字。如果您希望使用特定格式,请使用printf()

编辑如果你不熟悉2.1E-5语法,你应该知道它是2.1×10-5的简写。这是大多数编程语言在科学记数法中表示数字的方式。

nsc4cvqm

nsc4cvqm3#

如果希望看到预期的数字,请使用number_formatsprintf

echo sprintf('%f', $var);
echo number_format($var, 6);
ie3xauqp

ie3xauqp4#

要显示一个最多8个小数位的数字,而不需要在右边添加额外的零(就像number_format一样,这可能会很烦人),请使用以下命令:

echo rtrim(rtrim(sprintf('%.8F', $var), '0'), ".");
x8diyxa7

x8diyxa75#

一般来说,数字是一个数字,而不是一个字符串,这意味着任何编程语言都将数字视为数字。因此,数字本身并不意味着任何特定的格式(例如使用.000021而不是2.1e-5)。这与显示带有前导零的数字(如0.000021)或对齐数字列表没有什么不同。这是你在任何编程语言中都会发现的一个普遍问题:如果你想要一个特定的格式,你需要使用你的编程语言的格式函数来指定它。
当然,除非您将数字指定为字符串,并在需要时将其转换为真实的。有些语言可以隐式地做到这一点。

cidc1ykv

cidc1ykv6#

前面的答案回答了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;
}

请注意,函数将始终返回一个字符串。

nbysray5

nbysray57#

编程语言有不同的方法在内存中存储数字。这取决于正在使用的号码类型。在你的例子中,你有一个浮点数(一个分数),它太大了,不能存储为一个定点数(分数是根据它们的大小以这种方式存储的)。
这是一个非常重要的特征,尤其是在处理非常大或非常小的数字时。例如,NASA或SpaceX使用特殊的存储方法进行计算,以确保重返地球轨道的火箭降落在应该降落的地方。
此外,不同的存储方法占用不同的内存量。但是,上面提供的解决方案应该可以工作。请记住,舍入错误可能会发生在非常大或非常小的数字上。

m4pnthwp

m4pnthwp8#

我创建了一个类似下面的函数,它似乎工作正常。

function convertExponentialToDecimal($number) {

  $full_string = $number;

  $is_exponential = preg_match('/^\$?[+-]?\d+(\.\d+)?[Ee][+-]?\d+$/i', $full_string ); // check if the number is in exponential notation
  if ($is_exponential) {
    
      $decimal = sprintf("%.20f", $full_string );
      $decimal = bcmul($decimal, '1', 20);
      $decimal = rtrim($decimal, '0');
      $decimal = rtrim($decimal, '.');

  } else {
      $decimal = (float)$full_string;
  }

  return $decimal;

}

此函数可以将指数值转换为整数(十进制表示法)。

echo convertExponentialToDecimal('6.20503e-7');

上面的代码给出了0.000000620503的结果。
我不知道这是否是正确的解决方案;但是,它工作正常。

相关问题