PHP字符串转化为浮点数的坑

版权声明:本文为博主原创文章,未经博主允许不得转载。http://blog.csdn.net/leytton https://blog.csdn.net/Leytton/article/details/80951942

0x00 问题描述

偶然发现,将数据库内decimal(20,2)类型的数据查出来,乘以100并转化成整数的不精确问题。
代码如下:

$a="19.49";
echo "a=\"$a\"\n";
var_dump($a*100);
var_dump(intval($a*100));
var_dump(intval(round($a*100)));

$a="29.49";
echo "\na=\"$a\"\n";
var_dump($a*100);
var_dump(intval($a*100));
var_dump(intval(round($a*100)));

输出结果

a="19.49"
float(1949)
int(1948)//此处得到了1948的错误结果
int(1949)

a="29.49"
float(2949)
int(2949)//此处结果正确
int(2949)

0x01 原因排查

由于数据库查询出来为字符串类型,此处有将字符串转化为浮点型数据的过程,浮点数是不精确的:
float(19.49)可能在内存中的实际数值为19.489999,乘以100后为1948.9999..
float(29.49)可能在内存中的实际数值为29.490001,乘以100后为2949.0001..
单纯的intval类型转化会把内存中小数点后的全部舍掉,导致结果不精确。

0x02 解决方案

此处案例暂用intval(round()) 解决,先把内存中小数点后的数值四舍五入,再转化成整数。

猜你喜欢

转载自blog.csdn.net/Leytton/article/details/80951942