扫码关注官方订阅号
像银行卡号19或者16位的 $num=9559980799976753217; 输出变成了9.55998079998E+18 这种科学计数
9.55998079998E+18
使用下面两种方式也不行。
$str=(string)$num; $str=sprintf("%u",$num);
有什么好的办法没
闭关修行中......
本身赋值的时候,数值已经溢出了,那么PHP这时候已经做了科学计数法的处理,也就是说此时数据已经部分残缺了。没有解决办法。处理方式就是表创建该字段不应该用数字,而应该用字符串。
echo number_format($num,0,'','');//9559980799976753217
如前所说,赋值的时候精度已丢失,所以只能一开始赋值就使用字符串:
$num=“9559980799976753217”;
PHP$num=9559980799976753217; echo number_format($num);//输出9,559,980,799,976,753,152 echo str_replace(",","",number_format($num));//输出9559980799976753152
PHP
$num=9559980799976753217; echo number_format($num);//输出9,559,980,799,976,753,152 echo str_replace(",","",number_format($num));//输出9559980799976753152
这个答案是错误的.会有精度损失. 网上流传的是通过检测科学计数法,然后重新计算填充的. 目前看来,好像是1L的比较准确一些
PHP会将溢出的整数转换成double保存
<?php $f = 65536*65536*65536*4; // 2^50 $f += 1; // 2^50+1 $s1 = "$f"; // the usual way $s2 = sprintf ( "%.0f", $f );
赋值的时候精度已经损失了,何谈转换?
超过PHP_INT_MAX了,只能用字符串来代替了。。。
字面值9559980799976753217通过gettype(9559980799976753217)可以发现其是double类型的,所以$num=9559980799976753217;这样直接赋值的代码是无解的。
9559980799976753217
gettype(9559980799976753217)
double
$num=9559980799976753217;
但是,,,,,LZ你的银行卡号肯定不需要这样直接写死吧?一般应该是从配置文件、数据库、或用户提交的表单中获取的,那肯定本来就是string类型的,那么就直接存成string类型的就o了。
string
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
本身赋值的时候,数值已经溢出了,那么PHP这时候已经做了科学计数法的处理,也就是说此时数据已经部分残缺了。没有解决办法。处理方式就是表创建该字段不应该用数字,而应该用字符串。
echo number_format($num,0,'','');//9559980799976753217如前所说,赋值的时候精度已丢失,所以只能一开始赋值就使用字符串:
这个答案是错误的.会有精度损失.
网上流传的是通过检测科学计数法,然后重新计算填充的.
目前看来,好像是1L的比较准确一些
PHP会将溢出的整数转换成double保存
赋值的时候精度已经损失了,何谈转换?
超过PHP_INT_MAX了,只能用字符串来代替了。。。
字面值
9559980799976753217通过gettype(9559980799976753217)可以发现其是double类型的,所以$num=9559980799976753217;这样直接赋值的代码是无解的。但是,,,,,LZ你的银行卡号肯定不需要这样直接写死吧?一般应该是从配置文件、数据库、或用户提交的表单中获取的,那肯定本来就是
string类型的,那么就直接存成string类型的就o了。