Я читаю данные из электронных таблиц, которые содержат длинные строки числовых идентификаторов. Я пытаюсь сделать мою систему надежной, проверяя правильность чтения данных, даже если формат столбца неверно задан как число.
Таким образом, электронная таблица содержит номер 32486509223273700000
в научной нотации как 3.2486509223274E+19
, Прежде чем сохранить его как строку, мне нужно преобразовать его в исходное значение. Это где проблемы приходят.
Я не могу заставить PHP преобразовать научную нотацию в исходное число. Используя различные методы для преобразования числа обратно в оригинал, кажется, что он всегда имеет разные цифры вместо конечных нулей.
$i = 3.2486509223274E+19;
echo $i; //32486509223274000384
echo number_format($i,0,'',''); //32486509223274000384
echo sprintf('%0.0f', $i); //32486509223274000384
Обратите внимание, что я намерен сохранить конечный результат в виде строки.
Обратите внимание, что double
Формат с плавающей запятой имеет точность около 15,5 десятичных знаков. Все остальные отображаемые десятичные дроби экстраполируются. И, как всегда, экстраполяция — опасная игра.
Или, другими словами, 3.2486509223274E+19
представляет интервал, примерно от 3.24865092232739984E+19
в 3.24865092232740024E+19
, Любое целое число в этом интервале должно считаться «правильной» экстраполяцией.
Самое простое решение — преобразовать большое число в значение с плавающей точкой:
$i = 3.2486509223274E+19;
echo printf ("%.0f", $i);
// output 3248650922327400038420
Это может показаться немного неправильным значением, но его нельзя избежать, как уже указывало @LutzL.
в php.ini есть значение, называемое точность, сколько цифр будет отображаться для числа с плавающей запятой.
В вашем случае установите его как минимум 21.
Лучше установить его на 30
Точность = 30