2016-09-16 3 views
1

Я делаю вызов API, который в настоящее время выводимый в JSON,PHP округления моих номеров?

Поле продукт "ProductID":3468490060026049912

преобразовать в PHP, json_decode()

Тогда я вывести "Product ID" = float(3.4684900600261E+18)

Он получает изменен на float, который округлен, я ввожу эту фигуру в MYSQL, и она остается округленной фигурой.

Как преобразовать из JSON в PHP без округления, мне нужно, чтобы оно было правильным до 19 цифр?

+1

Вы на 32-битном PHP? И действительно? Я не могу думать ни о какой возможной причине, что вам нужны идентификаторы продуктов, которые высоки. –

+0

Идея программного обеспечения не моя, в любом случае я исправлен с ini_set («точность», 19); Thx –

ответ

-1

Исправлено с установкой ini_set('precision',19); наверху.

+0

Это обходной путь, а не исправление. Исправление состоит в том, чтобы загрузить их как строки, такие как Vincente. – Erik

+1

Обходной путь, который не работает на 32-битных машинах и на PHP 5 в Windows (независимо от архитектуры оборудования). Он не работает даже там, где он работает, потому что значения близки к пределу 64-битного целочисленного диапазона. Однозначные более длинные идентификаторы не могут быть сохранены в 64-битных целых числах, преобразуются в float, и их (4 или 5) наименее значимые цифры теряются. – axiac

1

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

Храните их как строки, и у вас не будет никаких проблем с точностью, независимо от того, сколько их цифр.

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

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

0

Значение слишком большой, чтобы быть сохранены в качестве integer на 32 битных машинах (максимум около 2 * 10 9 ), поэтому РНР преобразует его плавать.

На 64-битных машинах PHP может храниться как целое число, но его значение действительно близко к пределу (около 9 * 10). Другой идентификатор, начинающийся с 9 или один разряд дольше не подходит и преобразуется PHP в float.

Но числа с плавающей точкой теряют наименее значимые цифры.

В качестве быстрого обходного пути вы можете передать JSON_BIGINT_AS_STRING в качестве четвертого параметра в json_decode(), но он не фиксирует источник проблемы. Вы можете столкнуться с той же проблемой в Javascript или в коде базы данных.

Лучше всего создавать «ProductID» строку везде. Во всяком случае, это идентификатор. Вам не нужно выполнять математические операции с ним, просто чтобы сохранить его и найти.

Смежные вопросы