Преобразовать полную строку (представленную в экспоненциальном формате) обратно в число в переполнении стека

Я искал для преобразования моей строки экспоненциального числа в точное число.
Итак, у меня экспоненциальный номер хранится как строка в 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

Пожалуйста, покажи мне правильный способ конвертировать его.

-1

Решение

обновленный

Я согласен с Эдом Коттреллом, что ваша проблема заключается в том, как вы храните свои данные в БД. Однако, если это проект, в котором вы уже просматриваете большой набор данных, который уже хранится как показатель степени, то эта функция, которую я написал, должна работать для вас. Это должно работать на положительные и отрицательные основания и показатели. Это в основном имитирует способ, которым вы выполняете операцию вручную.

Я не смог найти способ сделать это, используя математические функции. Если кто-то знает, как это сделать лучше, пожалуйста, напишите. А пока мне было весело писать это.

Надеюсь, это поможет вам!

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
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector