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

时间:2017-12-29 06:32:57

标签: php soap simplexml exponential

我正在进行SOAP调用以从服务器获取一些数据,并且正在使用PHP中提供的SimpleXML扩展进行读取。现在,在金额字段中,我获得了诸如此2.796565248E9之类的值,并使用roundnumber_format函数将其转换为整数/十进制数,但它将结果显示为{{1 }} 只要。

现在,我从SOAP调用中获取了多个数值。我收到了22.796565248E9200.0等金额值。当我使用2000.0round函数时,我会分别获得number_format200.0的正确值,例如2000.0200。但是对于2000,我只获得2.796565248E9,而不是2,这是预期的。

首先我很困惑,但是当我转储那个保存了这个值的变量2796565248时,我得到了这个回复

$value->amount

现在,我认为因此没有显示出理想的结果。请在这里指导我。

3 个答案:

答案 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