当数字中包含“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-9
是0.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.063
是8.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 单元格中存储小数/双精度