php 浮点数计算求靠谱的!
PHPz
PHPz 2017-04-11 09:43:29
0
5
270

直接浮点数计算,有时候得出科学计数来,懵了!
然后找文档看到了bcp 等等说是高精度计算!
$integral_money = bcp(10, 500);
bcp(10, 500, 2); 得出了0.02 这不限制死了吗? 那是不是我所有计算我都要给一个小数位???
结果等于0 这不坑我吗?明明等于0.02好不好!为毛要给我等于0!
好吧,我把浮点数 X 100出来再来计算,还是会出现科学数,答案!这不玩我吗? 怎么PHP计算个浮点数这么坑啊!

PHPz
PHPz

学习是最好的投资!

全部回覆(5)
阿神

这不是PHP的问题,是浮点数的问题,一般设计人民币金额这样的字段,不要使用浮点数,使用整数型来储存,如果需要两位小数点,就把小数点后两位作为个位和十位。比如12.34,在数据库中储存为1234,计算时也是计算1234,只是前端显示时显示为12.34 。

可以参照一些第三方支付金额字段的设计,比如下面是ping++的『订单金额 amount』字段的设计:

PHPzhong

二进制无法精确表示浮点数
二进制只能表示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....

左手右手慢动作

<?php
bcscale(2);
?>

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!