我正在进行SOAP调用以从服务器获取一些数据,并使用PHP中可用的SimpleXML扩展名读取这些数据。现在,在金额字段中,我正在获取诸如此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(以及一些近乎重复的)提交,看起来 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);