当数字中包含“E”时,如何设置小数精度? [复制]

Posted

技术标签:

【中文标题】当数字中包含“E”时,如何设置小数精度? [复制]【英文标题】:How do you set precision of decimal when there is an "E" involved within the number? [duplicate] 【发布时间】:2021-12-07 12:45:55 【问题描述】:

我想将我的小数点修整为 8.063,而不是原来的 8.0638304611694E-9。我已经为它实现了一个功能,但是当其中有E-9 时它不起作用。我应该修改哪个部分??

public function setPrecision($number, $decimals = 0)

    $negation = ($number < 0) ? (-1) : 1;
    $coefficient = 10 ** $decimals;
    return $negation * floor((string)(abs($number) * $coefficient)) / $coefficient;

编辑

当我尝试调用该函数时,当前的实现给了我0

setPrecision(8.0638304611694E-9, 3); // 0

【问题讨论】:

php.net/manual/en/function.number-format.php ? php.net/manual/en/function.round.php ?如果不是,请说明为什么它们不适合您。 数字格式似乎不适用于我的数字,它也给了我 0.000。我会更新我的问题 实际上8.0638304611694E-90.0000000080638304611694 函数调用(编辑)的结果对我来说似乎正确?您正在四舍五入,就像 KIKO Software 所说的,您的数字在小数点后 3 位接近 0。 我尝试使用 12 作为函数的 $decimals 参数,它可以工作,但不知何故,它在结果中保留了 E-9。我想彻底删除它 【参考方案1】:

在 PHP 中,有(在撰写本文时)8519 builtin functions。其中一个可能会成功!

您可以在函数中使用log10()round()

function setPrecision($number, $precision = 0)

    $exponent = floor(log10($number)) - 1;
    return round($number, -$exponent + $precision - 1);


【讨论】:

注意:该功能可以优化,但应该是可读的。 这将输出 8.064E-9,这并不是 OP 正在寻找的(尽管比目前任何其他东西都更接近,诚然) 我试过了,正如@ADyson 指出的那样,它仍然在号码中打印E-9。我该如何摆脱它? @Tamma 为什么你需要/想要摆脱它?这只是一种演示格式。它所代表的基础数字仍然相同。在您尝试将数字呈现给人类之前,您无需担心这一点,真的。改变精度的函数是数学运算,而不是表示运算。正如上面所指出的,如果你只是从8.063E-9 中删除E-9,那么你会得到8.063,这不是同一个数字! @Tamma 但这会误导读者,因为8.0638.063,而8.063E-9 实际上是0.000000008063。不是一回事。 E... 格式只是提供了一种更紧凑的方式来写下来。如果您使用传统的四舍五入将0.000000008063 舍入到小数点后三位,您将得到0.000,正如我已经演示过的那样。 calculator.net/…【参考方案2】:

使用 sprintf 可以轻松完成具有一定位数的相对舍入。

$round = (float)sprintf('%0.3E', 8.0638304611694E-9);
var_dump($round);  //float(8.064E-9)

在此基础上,我有这个函数,它以一定的相对小数精度对浮点值进行舍入。

 /*
  * @return Float-Value with reduced precision
  * @param $floatValue: input (float)
  * @param $overallPrecision: 1..20 (default 10)
  */
  function roundPrecision($floatValue, $overallPrecision = 10)
  
    $p = min(20,max(0,$overallPrecision-1));
    $f =(float)sprintf('%.'.$p.'e',$floatValue);
    return $f;
  

示例 1

  $float = 0.0000123456789;
  $newFloat = roundPrecision($float,5);
  printf('%0.10f',$newFloat);  //0.0000123460

示例 2

  $float = 3456.7891234;
  $newFloat = roundPrecision($float,5);
  printf('%0.10f',$newFloat);  //3456.8000000000

【讨论】:

你读过cmets和讨论吗?

以上是关于当数字中包含“E”时,如何设置小数精度? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

当全球化将逗号设置为小数分隔符时,如何在 OpenXML Excel 单元格中存储小数/双精度

防止 MATLAB 舍入数字并设置小数精度

Nib 文件中包含哪些对象? [复制]

matlab如何设置小数点后位数?

当首先使用带有数据注释的 MVC 代码时,如何在显示名称中包含 html 标记?

如何在我的 Django 500.html 页面中包含堆栈跟踪?