Quiero recortar mi decimal en algo como 8.063 en lugar del original que es 8.0638304611694E-9 . Implementé una función para él, pero no funciona cuando hay E-9 en él. que parte debo modificar??
public function setPrecision($number, $decimals = 0) { $negation = ($number < 0) ? (-1) : 1; $coefficient = 10 ** $decimals; return $negation * floor((string)(abs($number) * $coefficient)) / $coefficient; }EDITAR
La implementación actual me dio 0 cuando intento llamar a la función.
setPrecision(8.0638304611694E-9, 3); // 0En PHP, hay (al momento de escribir) 8519 funciones integradas . ¡Probablemente uno de ellos haga el truco!
Podrías usar log10() y round() en tu función:
function setPrecision($number, $precision = 0) { $exponent = floor(log10($number)) - 1; return round($number, -$exponent + $precision - 1); }El redondeo relativo con un cierto número de dígitos se puede hacer fácilmente con sprintf.
$round = (float)sprintf('%0.3E', 8.0638304611694E-9); var_dump($round); //float(8.064E-9)Sobre esta base, tengo esta función que redondea los valores flotantes con cierta precisión decimal relativa.
/* * @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; }Ejemplo 1
$float = 0.0000123456789; $newFloat = roundPrecision($float,5); printf('%0.10f',$newFloat); //0.0000123460ejemplo 2
$float = 3456.7891234; $newFloat = roundPrecision($float,5); printf('%0.10f',$newFloat); //3456.8000000000