我正在进行SOAP调用以从服务器获取一些数据,并且正在使用PHP中提供的SimpleXML扩展进行读取。现在,在金额字段中,我获得了诸如此2.796565248E9
之类的值,并使用round
或number_format
函数将其转换为整数/十进制数,但它将结果显示为{{1 }} 只要。
现在,我从SOAP调用中获取了多个数值。我收到了2
,2.796565248E9
,200.0
等金额值。当我使用2000.0
或round
函数时,我会分别获得number_format
和200.0
的正确值,例如2000.0
和200
。但是对于2000
,我只获得2.796565248E9
,而不是2
,这是预期的。
首先我很困惑,但是当我转储那个保存了这个值的变量2796565248
时,我得到了这个回复
$value->amount
现在,我认为因此没有显示出理想的结果。请在这里指导我。
答案 0 :(得分:3)
您传递给round
的值需要在函数运行之前转换为浮动,可以由代码显式转换,也可以由PHP引擎隐式转换。如果传入一个字符串,它将被自动强制转换为浮点数,但是如果你传入一个对象 - 比如你在这里的SimpleXMLElement
- 它会被转换为int。
这是因为PHP的内部问题,以PHP bug #53033(以及一些近似重复)提交,看起来像Nikita Popov has fixed for PHP 7.3。基本上,引擎无法使用自定义转换代码询问对象"数字",因此它无法在float和int之间巧妙地选择。
与此同时,显式转换为float,例如$value = round( (float)$my_object, $precision );
将避免此问题。
转换为字符串也可以,因为引擎知道它应该在这种情况下将字符串转换为浮点数,因此在提取时在元素和属性前面添加(string)
是一个很有用的习惯他们来自SimpleXML。这也避免了其他问题,例如意外地尝试在会话中序列化对象,或者将XML保留在内存中的时间超过了必要的时间,因为它可以从某个值对象访问。
答案 1 :(得分:1)
使用第二个arg尝试round(),这是小数点后的值的偏移量: -
round(2.79656,2)
您可以参考以下链接: https://www.w3schools.com/php/func_math_round.asp
答案 2 :(得分:1)
使用<?php
$scientific_str="2.796565248E9";
$scientific_num=(float) $scientific_str;
var_dump($scientific_num);
会有所帮助。请尝试以下代码:
commitlog_directory: /home/cass/ share/cassandra/commitlog