float
通常在计算价格时,会碰到令人头疼的浮点数计算问题,日常生活中我们是以元
作为单位的,例如 9.9 元
。
永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。
你看似有穷的小数, 在计算机的二进制表示里却是无穷的。
PHP 中的金额计算
$val1 = 3902 * 0.01;
echo $val1;
// 39.100000000000001
// 结果并不是 39.02
而且随着浮点数的计算量越大,误差也会逐步放大,差之毫厘谬以千里
。
为了避免这样的情况,主要有两种解决方案:
- 以
分
为计算单位,这样参与计算的全是整数; - 以
元
为计算单位,使用BC Math
;
这块的资金问题还是得考虑业务需求的。按我以前的做法,是保存4位小数。根据不同的场景,进行取舍!但前台所有显示的金额都只显示2位,并向下取数
我们生活中的金融系统最多只有两位小数位,比如12.37,精确到分。其实金融系统只是面向用户只展示了两位小数,比如你的余额是 12032.12,在银行系统里的真实值可能是 12032.12593... 保留有效的小数位数由系统所需的精度要求来决定。