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

How to convert exponential number(SimpleXML object string) to decimal in PHP

我正在进行 SOAP 调用以从服务器获取一些数据,并使用 PHP 中提供的 SimpleXML 扩展读取数据。现在,在 amount 字段中,我得到了这样的值 2.796565248E9 并使用 roundnumber_format 函数将其转换为 whole/decimal 数字,但它给我的结果是 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() 和第二个参数,它是小数点后值的偏移量:-

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 在内存中保留的时间超过必要的时间,因为它可以从某些值对象访问。