讨论数量:
金额最小单位是1分,也就是1,以元作为单位就是0.01。出现浮点数精度丢失有可能是因为有限位数存储超过这个位数的小数,例如数据库decimal(5,1),范围应该是-999.9~999.9(一般来说负数用的少),我存储一个数为1.23,数据库里显示是1.2,但是计算的时候可能就会出问题;因此有几种办法:
一种是以1为最小单位,这样就不会有太多问题,但是每次存取都需要转换; 二是精确的位数存储精确的位数; 三是以字符串的形式存储。 推荐是使用第二种,前端的计算显示可能也会有问题,但是整体来说对于金额是最友好的。
var_dump(32.8 * 100) ; //float(3280)
是个无限接近 3280
的浮点型,类似 3279.999..
。
用 (int)
强制转成整形,就变成 3279
了。floor($b);//3279
。
这样的话还不如不转,直接 32.8 * 100
。
你看似有穷的小数, 在计算机的二进制表示里却是无穷的
(int)(32.8 * 100);//3279
32.8 这个小数在计算机中就是不精确的,所以用不精确的值再做乘法加多少个 0 也没有用。
代码里全用「分」,不考虑「元」,让前端转。就不会有 “计算麻烦” 这件事了
可以看下鸟哥的文章:PHP浮点数的一个常见问题的解答
推荐文章: