Я имею число с плавающей запятой в экспоненциальном формате, то есть 4.1595246940817E-17
и я хочу преобразовать его в десятичное число, например 2.99 и т. Д.
Любая помощь будет оценена.
format_number()
sprintf()
, похоже, не работает для меня.
Вам нужно лучшее математическое расширение, такое как BC Math, GMP … для обработки более точной точности.
Ограничение плавающего числа и целого числа
Используя библиотеку BC Math, вы можете bcscale()
числа до заданного десятичного знака, который устанавливает параметр для будущих вычислений, требующих арифметической точности.
bcscale(3); echo bcdiv('105', '6.55957'); // 16.007
Вы можете удалить десятичную точку ($ x – ваш номер):
$strfloat = strtolower((string)($x)); $nodec = str_replace(".", "", $x);
Затем извлеките экспоненциальную часть.
list($num, $exp) = explode("e", $nodec); $exp = intval($exp);
Затем у вас есть десятичное число и номер, поэтому вы можете отформатировать его:
if($exp < 0) return "0." . ("0" * -($exp + 1)) . $num; if($exp == 0) return (string)$x; if($exp > 0) return $num . ("0" * $exp);
Это не добавляет точности, а просто лишние нули.
Вот решение, использующее BC Math , как было предложено ajreal и Russell Dias:
$au = 65536; $auk = bcdiv($au, 1024); $totalSize = bcdiv(bcmul(49107, $auk), bcpow(1024, 2), 2); echo $totalSize . "\n"; // echos 2.99