我想把我的十进制修剪成类似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发布于 2021-12-07 13:03:24
在PHP中,有(在编写时) 8519内建功能。他们中的一个很有可能做到了!
您可以在函数中使用log10()和round():
function setPrecision($number, $precision = 0)
{
$exponent = floor(log10($number)) - 1;
return round($number, -$exponent + $precision - 1);
}发布于 2021-12-07 14:40:36
与一定数量的数字的相对舍入可以很容易地用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.8000000000https://stackoverflow.com/questions/70260389
复制相似问题