soap — Как преобразовать экспоненциальное число (строку объекта SimpleXML) в десятичное в переполнении стека

Я делаю SOAP-вызов для получения некоторых данных с сервера и читаю их, используя расширение SimpleXML, доступное в PHP. Теперь в поле количества я получаю значение, подобное этому 2.796565248E9 и использовал round или же number_format функция для преобразования его в целое / десятичное число, но это дает мне результат как 2 только.

Теперь я получаю несколько значений суммы из этого вызова SOAP. И я получаю значения суммы, такие как 2.796565248E9, 200.0, 2000.0, Когда я использую round или же number_format функция, я получаю правильное значение для 200.0 а также 2000.0 лайк 200 а также 2000 соответственно. Но для 2.796565248E9Получаю только 2 только не 2796565248, что ожидается.

Сначала я был сбит с толку, но когда я сбрасываю эту переменную, т.е. $value->amount который держит это значение, я получил этот ответ

object(SimpleXMLElement)#354 (1) {
[0]=>  string(13) "2.796565248E9"}

Теперь, я думаю, из-за этого он не показывает желаемого результата. Пожалуйста, направьте меня сюда.

1

Решение

Значение, которое вы передаете round Необходимо выполнить приведение к плавающему типу перед выполнением функции, либо явно вашим кодом, либо неявно механизмом PHP. Если вы передадите строку, она будет автоматически переведена в число с плавающей точкой, но если вы передадите объект — такой как SimpleXMLElement у вас есть здесь — вместо этого он приводится к int.

Это из-за проблемы с внутренностями PHP, поданной как Ошибка PHP # 53033 (и несколько почти дубликатов), на что это похоже Никита Попов исправил для PHP 7.3. По сути, у движка не было возможности запросить объект с пользовательским кодом преобразования для «числа», поэтому он не мог разумно выбирать между float и int.

В то же время, явное приведение к плаванию, например,$value = round( (float)$my_object, $precision ); позволит избежать проблемы.

Преобразование в строку также будет работать, потому что движок знает, что в этой ситуации он должен преобразовать строку в число с плавающей точкой, так что это может быть полезной общей привычкой для добавления (string) перед элементами и атрибутами, как вы извлекаете их из SimpleXML. Это также позволяет избежать других проблем, таких как случайная попытка сериализации объекта в сеансе или сохранение XML в памяти дольше, чем необходимо, поскольку он доступен из некоторого объекта значения.

3

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

Попробуйте round () со вторым аргументом, который является смещением для значений после десятичного числа: —

round(2.79656,2)

Вы можете обратиться к этой ссылке: —
https://www.w3schools.com/php/func_math_round.asp

1

С помощью (float) поможет. Попробуйте следующий код:

<?php
$scientific_str="2.796565248E9";
$scientific_num=(float) $scientific_str;
var_dump($scientific_num);
1
По вопросам рекламы [email protected]