математика — неверный номер из научной нотации в переполнении стека

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

Таким образом, электронная таблица содержит номер 32486509223273700000 в научной нотации как 3.2486509223274E+19, Прежде чем сохранить его как строку, мне нужно преобразовать его в исходное значение. Это где проблемы приходят.

Я не могу заставить PHP преобразовать научную нотацию в исходное число. Используя различные методы для преобразования числа обратно в оригинал, кажется, что он всегда имеет разные цифры вместо конечных нулей.

$i = 3.2486509223274E+19;
echo $i; //32486509223274000384
echo number_format($i,0,'',''); //32486509223274000384
echo sprintf('%0.0f', $i); //32486509223274000384

Обратите внимание, что я намерен сохранить конечный результат в виде строки.

1

Решение

Обратите внимание, что double Формат с плавающей запятой имеет точность около 15,5 десятичных знаков. Все остальные отображаемые десятичные дроби экстраполируются. И, как всегда, экстраполяция — опасная игра.

Или, другими словами, 3.2486509223274E+19 представляет интервал, примерно от 3.24865092232739984E+19 в 3.24865092232740024E+19, Любое целое число в этом интервале должно считаться «правильной» экстраполяцией.

2

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

Самое простое решение — преобразовать большое число в значение с плавающей точкой:

$i = 3.2486509223274E+19;
echo printf ("%.0f", $i);
// output 3248650922327400038420

Это может показаться немного неправильным значением, но его нельзя избежать, как уже указывало @LutzL.

2

в php.ini есть значение, называемое точность, сколько цифр будет отображаться для числа с плавающей запятой.
В вашем случае установите его как минимум 21.
Лучше установить его на 30

Точность = 30

0
По вопросам рекламы [email protected]