如何在PHP中将指数数字(SimpleXML对象字符串)转换为十进制



我正在进行SOAP调用以从服务器获取一些数据,并使用PHP中可用的SimpleXML扩展名读取这些数据。现在,在金额字段中,我正在获取诸如此2.796565248E9的值,并使用roundnumber_format函数将其转换为整数/十进制数,但它仅以2形式为我提供结果。

现在,我从该 SOAP 调用中获取多个金额值。我正在获得诸如2.796565248E9200.02000.0等金额值。当我使用roundnumber_format函数时,我分别获得200.02000.0的适当值,例如2002000。但对于2.796565248E9,我只得到2,而不是2796565248,这是意料之中的。

首先我很困惑,但是当我转储该变量时,即$value->amount保持此值,我得到了此响应

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

现在,我认为正因为如此,它没有显示出预期的结果。请引导我到这里。

在函数运行之前,您传递给round的值需要强制转换为浮点数,无论是由代码显式还是由 PHP 引擎隐式。如果你传入一个字符串,它将自动强制转换为浮点数,但如果你传入一个对象 - 例如你在这里的SimpleXMLElement- 它会被转换为 int。

这是因为 PHP 的内部存在问题,作为 PHP 错误 #53033(以及一些近乎重复的)提交,看起来 Nikita Popov 已经为 PHP 7.3 修复了这个问题。基本上,引擎无法向具有自定义转换代码的对象询问"数字",因此它无法在浮点数和整数之间进行明智的选择。

同时,显式转换为浮点数,例如$value = round( (float)$my_object, $precision );将避免该问题。

强制转换为字符串也可以工作,因为引擎知道在这种情况下应该将字符串转换为浮点数,因此在从 SimpleXML 中提取元素和属性时,在元素和属性前面添加(string)可能是一个有用的一般习惯。这还可以避免其他问题,例如意外尝试序列化会话中的对象,或者将 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);

最新更新