84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
直接浮点数计算,有时候得出科学计数来,懵了!然后找文档看到了bcp 等等说是高精度计算!$integral_money = bcp(10, 500);bcp(10, 500, 2); 得出了0.02 这不限制死了吗? 那是不是我所有计算我都要给一个小数位???结果等于0 这不坑我吗?明明等于0.02好不好!为毛要给我等于0!好吧,我把浮点数 X 100出来再来计算,还是会出现科学数,答案!这不玩我吗? 怎么PHP计算个浮点数这么坑啊!
学习是最好的投资!
这不是PHP的问题,是浮点数的问题,一般设计人民币金额这样的字段,不要使用浮点数,使用整数型来储存,如果需要两位小数点,就把小数点后两位作为个位和十位。比如12.34,在数据库中储存为1234,计算时也是计算1234,只是前端显示时显示为12.34 。
可以参照一些第三方支付金额字段的设计,比如下面是ping++的『订单金额 amount』字段的设计:
二进制无法精确表示浮点数二进制只能表示2的N次方的数(N为整数),浮点数都是近似表示的。
php是由c语言编写的,这个坑是在c语言中就有的,二进制无法表示完整小数,会出现循环小数,结果会有偏差
http://php.net/manual/zh/lang...以十进制能够精确表示的有理数如0.1或0.7,无论有多少尾数都不能被内部所使用的二进制精确表示.因此不能在不丢失一点点精度的情况下转换为二进制的格式.这就会造成混乱的结果,例如 floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8.因为该结果内部的表示其实是类似 7.9999999999999991118...永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等.如果确实需要更高的精度,应该使用bcmath(Binary Calculator Math)函数或者gmp(GNU Multiple Precision)函数.http://php.net/manual/zh/ref....http://php.net/manual/zh/ref....
bcscale(2);?>
这不是PHP的问题,是浮点数的问题,一般设计人民币金额这样的字段,不要使用浮点数,使用整数型来储存,如果需要两位小数点,就把小数点后两位作为个位和十位。比如12.34,在数据库中储存为1234,计算时也是计算1234,只是前端显示时显示为12.34 。
可以参照一些第三方支付金额字段的设计,比如下面是ping++的『订单金额 amount』字段的设计:
![](http://img.php.cn/upload/image/000/000/000/a3102bfedb480637a97311d8e5a9395e-0.jpg)
二进制无法精确表示浮点数
二进制只能表示2的N次方的数(N为整数),浮点数都是近似表示的。
php是由c语言编写的,这个坑是在c语言中就有的,二进制无法表示完整小数,会出现循环小数,结果会有偏差
http://php.net/manual/zh/lang...
以十进制能够精确表示的有理数如0.1或0.7,无论有多少尾数都不能被内部所使用的二进制精确表示.
因此不能在不丢失一点点精度的情况下转换为二进制的格式.
这就会造成混乱的结果,例如 floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8.
因为该结果内部的表示其实是类似 7.9999999999999991118...
永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等.
如果确实需要更高的精度,应该使用bcmath(Binary Calculator Math)函数或者gmp(GNU Multiple Precision)函数.
http://php.net/manual/zh/ref....
http://php.net/manual/zh/ref....
bcscale(2);
?>