Я делаю 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"}
Теперь, я думаю, из-за этого он не показывает желаемого результата. Пожалуйста, направьте меня сюда.
Значение, которое вы передаете round
Необходимо выполнить приведение к плавающему типу перед выполнением функции, либо явно вашим кодом, либо неявно механизмом PHP. Если вы передадите строку, она будет автоматически переведена в число с плавающей точкой, но если вы передадите объект — такой как SimpleXMLElement
у вас есть здесь — вместо этого он приводится к int.
Это из-за проблемы с внутренностями PHP, поданной как Ошибка PHP # 53033 (и несколько почти дубликатов), на что это похоже Никита Попов исправил для PHP 7.3. По сути, у движка не было возможности запросить объект с пользовательским кодом преобразования для «числа», поэтому он не мог разумно выбирать между float и int.
В то же время, явное приведение к плаванию, например,$value = round( (float)$my_object, $precision );
позволит избежать проблемы.
Преобразование в строку также будет работать, потому что движок знает, что в этой ситуации он должен преобразовать строку в число с плавающей точкой, так что это может быть полезной общей привычкой для добавления (string)
перед элементами и атрибутами, как вы извлекаете их из SimpleXML. Это также позволяет избежать других проблем, таких как случайная попытка сериализации объекта в сеансе или сохранение XML в памяти дольше, чем необходимо, поскольку он доступен из некоторого объекта значения.
Попробуйте round () со вторым аргументом, который является смещением для значений после десятичного числа: —
round(2.79656,2)
Вы можете обратиться к этой ссылке: —
https://www.w3schools.com/php/func_math_round.asp
С помощью (float)
поможет. Попробуйте следующий код:
<?php
$scientific_str="2.796565248E9";
$scientific_num=(float) $scientific_str;
var_dump($scientific_num);