Я искал для преобразования моей строки экспоненциального числа в точное число.
Итак, у меня экспоненциальный номер хранится как строка в MySQL. Я хочу преобразовать эту строку в точное число.
Но кажется, что число довольно большое и пересекает границу и предоставляет мне неверные данные.
Хотя я попробовал следующий код в различном формате, но результат не в правильном формате.
policy_number = "2.9992020830803E+18";
number_format($policy_number, 0,'.','');
// Output
2999202083080300032
(float) $policy_number;
// Output
2.9992020830803E+18
sscanf($policy_number, "%f")[0];
// Output
2.9992020830803E+18
floatval($policy_number);
// Output
2.9992020830803E+18
gmp_init("2.9992020830803E+18");
gmp_strval($policy_number);
// Output
0
"2.9992020830803E+18" + 0;
// Output
2.9992020830803E+18
Пожалуйста, покажи мне правильный способ конвертировать его.
обновленный
Я согласен с Эдом Коттреллом, что ваша проблема заключается в том, как вы храните свои данные в БД. Однако, если это проект, в котором вы уже просматриваете большой набор данных, который уже хранится как показатель степени, то эта функция, которую я написал, должна работать для вас. Это должно работать на положительные и отрицательные основания и показатели. Это в основном имитирует способ, которым вы выполняете операцию вручную.
Я не смог найти способ сделать это, используя математические функции. Если кто-то знает, как это сделать лучше, пожалуйста, напишите. А пока мне было весело писать это.
Надеюсь, это поможет вам!
function getRealNumber($number){
//Parse the base and exponent.
preg_match('/^(.*?)E[\-|\+](.*?)$/', $number, $data);
$base = $data[1];
$exp = $data[2];
//Test to see if the base is negative.
if(preg_match('/\-/', $base)){
$base = str_replace('-', '', $base);
$isNegative = TRUE;
}
//Capture the offset of the decimal point.
preg_match('/\./', $base, $position, PREG_OFFSET_CAPTURE);
$offset = $position[0][1]; //This is the offset of the decimal point.
$string = str_replace('.', '', $base); //Get numbers without decimal.
$length = strlen($string); //Get the length of string.
//Test to see if we are adding zeros to the end or beginning of string.
if(preg_match('/E\+/', $number)){
//Let's move the decimal.
if($length > ($exp + $offset)){
$string = substr_replace($string, '.', ($exp + $offset), 0);
} else {
$string = $string . str_repeat('0', $exp - ($length - $offset));
}
}elseif(preg_match('/E\-/', $number)){
//Calculate the number of zeros needed to add and append them.
if($offset > $exp){
$string = substr_replace($string, '.', $offset, 0);
} else {
$string = '0.' . str_repeat('0', $exp - $offset) . $string;
}
}
//Add the negative sign if we need to.
if(!$isNegative){
return $string;
} else {
return '-' . $string;
}
}
$policy_number = "2.9992020830803E+18";
echo getRealNumber($policy_number);
//Will output 2999202083080300000
Других решений пока нет …