Преобразование строки, содержащей число в научной нотации, в double в PHP
Мне нужна помощь в преобразовании строки, содержащей число в научной нотации, в двойную.
Примеры строк:
"1.8281e-009"
"2.3562e-007"
"0.911348"
Я думал о том, чтобы просто сломать число в число слева и экспоненту, а не просто делать математику для генерации числа; но есть ли лучший/стандартный способ сделать это?
Ответы
Ответ 1
PHP является typeless динамически типизированным, то есть он должен анализировать значения для определения их типов (последние версии PHP имеют объявления типа).
В вашем случае вы можете просто выполнить числовую операцию, чтобы заставить PHP рассматривать значения как числа (и понимает научную нотацию x.yE-z
).
Попробуйте, например,
foreach (array("1.8281e-009","2.3562e-007","0.911348") as $a)
{
echo "String $a: Number: " . ($a + 1) . "\n";
}
просто добавив 1 (вы также можете вычесть ноль) сделает строки целыми числами с нужным количеством десятичных знаков.
Результат:
String 1.8281e-009: Number: 1.0000000018281
String 2.3562e-007: Number: 1.00000023562
String 0.911348: Number: 1.911348
Вы также можете сделать результат с помощью (float)
$real = (float) "3.141592e-007";
Ответ 2
$f = (float) "1.8281e-009";
var_dump($f); // float(1.8281E-9)
Ответ 3
$float = sprintf('%f', $scientific_notation);
$integer = sprintf('%d', $scientific_notation);
if ($float == $integer)
{
// this is a whole number, so remove all decimals
$output = $integer;
}
else
{
// remove trailing zeroes from the decimal portion
$output = rtrim($float,'0');
$output = rtrim($output,'.');
}
Ответ 4
Следующая строка кода может помочь вам отобразить значение bigint,
$token= sprintf("%.0f",$scienticNotationNum );
обратитесь по этой ссылке.
Ответ 5
Я нашел сообщение, которое использовало number_format для преобразования значения из числа нотных обозначений с плавающей точкой в неназначенный номер нотации:
http://jetlogs.org/2008/02/05/php-problems-with-big-integers-and-scientific-notation/
Примечание редактора: Ссылка прогнила
Пример из сообщения:
$big_integer = 1202400000;
$formatted_int = number_format($big_integer, 0, '.', '');
echo $formatted_int; //outputs 1202400000 as expected
НТН
Ответ 6
Используйте функции number_format()
и rtrim()
вместе. Например,
//eg $sciNotation = 2.3649E-8
$number = number_format($sciNotation, 10); //Use $dec_point large enough
echo rtrim($number, '0'); //Remove trailing zeros
Я создал функцию с большим количеством функций (каламбур не предназначен)
function decimalNotation($num){
$parts = explode('E', $num);
if(count($parts) != 2){
return $num;
}
$exp = abs(end($parts)) + 3;
$decimal = number_format($num, $exp);
$decimal = rtrim($decimal, '0');
return rtrim($decimal, '.');
}
Ответ 7
function decimal_notation($float) {
$parts = explode('E', $float);
if(count($parts) === 2){
$exp = abs(end($parts)) + strlen($parts[0]);
$decimal = number_format($float, $exp);
return rtrim($decimal, '.0');
}
else{
return $float;
}
}
работает с 0.000077240388