You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHP保留两位小数问题:number_format转float后数值异常

解决PHP中数值保留两位小数且保持数值类型的问题

我知道这个问题看起来挺基础的,但试了好几种方法都没搞定。我有个整数或者浮点数,想要格式化为保留两位小数的形式。用number_format()的时候,它直接把数值转成字符串了;要是用(float)或者floatval()转回去,数值还被截断了,比如下面这段代码:

$revenue_sum = array_sum(array_column($val2, 'weighted_revenue')); //23722
$test = number_format($revenue_sum, 2); //"23,722.00"
$test = (float)number_format($revenue_sum, 2); //23.0
$test = floatval(number_format($revenue_sum, 2)); //23.0

我想要的结果是:当$revenue_sum为23722时,$test为23722.00;当$revenue_sum为2372.2时,$test为2372.20。


问题原因

其实问题出在number_format()默认会添加千位分隔符(就是那个逗号),当你把带逗号的字符串转成浮点数时,PHP只会读取逗号前面的部分,所以才会出现23.0这种截断后的结果。

解决方案

这里有两种靠谱的处理思路:

思路1:去掉千位分隔符后转成浮点数

你可以给number_format()传入第四个参数,把千位分隔符设为空字符串,这样生成的字符串就没有逗号了,转成浮点数就不会被截断:

$test = (float)number_format($revenue_sum, 2, '.', '');

或者更直接用sprintf()来格式化,它本身就不会添加千位分隔符:

$test = (float)sprintf("%.2f", $revenue_sum);

这样处理后,不管原数值是整数还是浮点数,都能得到保留两位小数的数值类型结果。不过要注意:浮点数本身的存储特性可能存在细微精度问题,如果你的需求只是显示两位小数,其实没必要转成浮点数,直接用字符串格式输出就足够了。

思路2:直接用字符串格式满足显示需求

如果只是需要把数值展示成两位小数的形式,直接用number_format()去掉千位分隔符后输出即可:

echo number_format($revenue_sum, 2, '.', '');

这样就能直接输出23722.00或者2372.20,既不会有截断问题,也完全满足显示需求。

内容的提问来源于stack exchange,提问作者fahad shaikh

火山引擎 最新活动