将661884E+17转换为PHP中的字符串

将661884E+17转换为PHP中的字符串,php,csv,numbers,Php,Csv,Numbers,我有来自csv的数据,列id的内容如下所示:6.61884E+17 6.61881E+17 6.61878E+17 此代码无效,此代码的结果保持不变: $a = '6.61884E+17'; $b = (string) floatval($a); 如何将6.61884E+17转换为字符串 更新: 我尝试使用数字格式6.61884E+17,0,结果得到661884000000000000。我的预期结果是661883847445868544您希望从6.61884E+17中提取数字661883847

我有来自csv的数据,列id的内容如下所示:6.61884E+17 6.61881E+17 6.61878E+17

此代码无效,此代码的结果保持不变:

$a = '6.61884E+17';
$b = (string) floatval($a);
如何将6.61884E+17转换为字符串

更新:

我尝试使用数字格式6.61884E+17,0,结果得到661884000000000000。我的预期结果是661883847445868544

您希望从6.61884E+17中提取数字661883847445868544。 由于整数溢出,您无法执行此操作

PHP通过将其转换为浮点来为您处理此问题。这很愚蠢,因为您无法对它们执行基本的算术运算

现在,如果运行echo strval661883847445868544;然后返回相同的值,您运行的是64位PHP,并且可以处理该数字。但是,很明显,创建CSV的程序是32位的,最大整数值是:

2,147,483,647 signed
4,294,967,295 unsigned

值6.61884E+17被转储后,第6位数字后的精度将丢失,您无法将其恢复。对不起

使用sprint或类似的$a='6.61884E+17'$b=sprintf“%f”,floatval$a;亿美元;这应该可以解决你的问题:从技术上讲,这个数字是正确的。PHP将大整数转换为浮点数,使指数精度降低。你“可以”用MCBath来扩展它,但你得到的只是一个非常大的数字,末尾有很多零@阿纳塔西亚已经说过了。如果您控制CSV的生成,并且程序支持任意精度的PHP和bcmath,那么您可以转储完整的值。但是任意精度是有传染性的,一旦你开始依赖它,你将永远无法停止使用它,所以最好解决这个问题。