如何在 PHP 中将指数数(SimpleXML 对象字符串)转换为小数
How to convert exponential number(SimpleXML object string) to decimal in PHP
我正在进行 SOAP 调用以从服务器获取一些数据,并使用 PHP 中提供的 SimpleXML 扩展读取数据。现在,在 amount 字段中,我得到了这样的值 2.796565248E9
并使用 round
或 number_format
函数将其转换为 whole/decimal 数字,但它给我的结果是 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() 和第二个参数,它是小数点后值的偏移量:-
round(2.79656,2)
可以参考这个link:-
https://www.w3schools.com/php/func_math_round.asp
使用 (float)
会有帮助。试试下面的代码:
<?php
$scientific_str="2.796565248E9";
$scientific_num=(float) $scientific_str;
var_dump($scientific_num);
您传递给 round
的值需要在函数运行之前转换为浮点数,可以通过您的代码显式转换,也可以通过 PHP 引擎隐式转换。如果你传入一个字符串,它会自动被强制转换为一个浮点数,但如果你传入一个对象——比如你这里的 SimpleXMLElement
——它会被强制转换为一个 int。
这是因为 PHP 的内部问题,归档为 PHP bug #53033 (and a few near-duplicates), which it looks like Nikita Popov has fixed for PHP 7.3。基本上,引擎无法向具有自定义转换代码的对象询问 "a number",因此它无法在 float 和 int 之间巧妙地选择。
同时,显式转换为浮动,例如$value = round( (float)$my_object, $precision );
将避免该问题。
转换为字符串也可以,因为引擎知道在这种情况下它应该将字符串转换为浮点数,因此在元素和属性前面添加 (string)
可能是一个有用的通用习惯你从 SimpleXML 中提取它们。这也避免了其他问题,例如意外地尝试在会话中序列化对象,或者将 XML 在内存中保留的时间超过必要的时间,因为它可以从某些值对象访问。
我正在进行 SOAP 调用以从服务器获取一些数据,并使用 PHP 中提供的 SimpleXML 扩展读取数据。现在,在 amount 字段中,我得到了这样的值 2.796565248E9
并使用 round
或 number_format
函数将其转换为 whole/decimal 数字,但它给我的结果是 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() 和第二个参数,它是小数点后值的偏移量:-
round(2.79656,2)
可以参考这个link:- https://www.w3schools.com/php/func_math_round.asp
使用 (float)
会有帮助。试试下面的代码:
<?php
$scientific_str="2.796565248E9";
$scientific_num=(float) $scientific_str;
var_dump($scientific_num);
您传递给 round
的值需要在函数运行之前转换为浮点数,可以通过您的代码显式转换,也可以通过 PHP 引擎隐式转换。如果你传入一个字符串,它会自动被强制转换为一个浮点数,但如果你传入一个对象——比如你这里的 SimpleXMLElement
——它会被强制转换为一个 int。
这是因为 PHP 的内部问题,归档为 PHP bug #53033 (and a few near-duplicates), which it looks like Nikita Popov has fixed for PHP 7.3。基本上,引擎无法向具有自定义转换代码的对象询问 "a number",因此它无法在 float 和 int 之间巧妙地选择。
同时,显式转换为浮动,例如$value = round( (float)$my_object, $precision );
将避免该问题。
转换为字符串也可以,因为引擎知道在这种情况下它应该将字符串转换为浮点数,因此在元素和属性前面添加 (string)
可能是一个有用的通用习惯你从 SimpleXML 中提取它们。这也避免了其他问题,例如意外地尝试在会话中序列化对象,或者将 XML 在内存中保留的时间超过必要的时间,因为它可以从某些值对象访问。