-

PHP浮点数运算精度问题

PHP

最近有客户反应商城订单金额总是不准确,总是相隔一分钱。检查相关代码逻辑都是正确的,就是运用了四则运算。大概推测问题可能出在浮点计算丢失精度。在《雷雪松的博客》中写过一篇关于JS精度不准确的文章-《JS中浮点数运算不精准》。下面雷雪松详细的介绍一下如何解决PHP浮点数运算精度问题。

PHP有一个BC Math高精确度的数学扩展,它可以为任意精度数学计算提供了二进制计算器(Binary Calculator),它支持任意大小和精度的数字,以字符串形式描述。在需要处理数字计算时,不要在简单地使用四则运算,而要用BC Math相关的函数来处理。

1、安装BC Math扩展
本类函数仅在 PHP 编译时配置了 –enable-bcmath 时可用。PHP 的 Windows 版本已内建对此扩展的支持,不需要载入额外的扩展来使用这些函数。如果需要编译安装,请参考PHP安装编译配置里的扩展

2、BC Math提供的函数
bcadd — 2个任意精度数字的加法计算
bccomp — 比较两个任意精度的数字
bcdiv — 2个任意精度的数字除法计算
bcmod — 对一个任意精度数字取模
bcmul — 2个任意精度数字乘法计算
bcpow — 任意精度数字的乘方
bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulus
bcscale — 设置所有bc数学函数的默认小数点保留位数
bcsqrt — 任意精度数字的二次方根
bcsub — 2个任意精度数字的减法

3、BC Math函数用法
[cc lang=”php”]bcscale(3); /设置小数点之后的位数,不设置,默认正整数
echo bcadd(‘1.234’, ‘5’); // 6.234
echo bcsub(‘1.234’, ‘5’); // -3.766
echo bcmul(‘2’, ‘4’); // 8
echo bcdiv(‘105’, ‘6.55957’, 3); // 16.007,设置3位小数点
echo bcmod(‘4’, ‘2’); // 0[/cc]

来源:PHP浮点数运算精度问题

9 评论 “PHP浮点数运算精度问题

    yahua 评论:
    2018年5月12日 上午9:15

    一个博客能让人流连忘返,讲真,靠的是实力!

    免费推广网 评论:
    2018年5月22日 上午10:51

    商品定价还到分

    巨根增大网 评论:
    2018年6月1日 上午9:05

    让人百看不厌的博客,真的不是很多!

    藏金网 评论:
    2018年6月7日 上午9:23

    这个博客就像一座宝藏,我是来掘金滴!

    kitty23 评论:
    2018年6月18日 上午10:33

    第一次看,感觉还挺新鲜!

    新闻头条 评论:
    2018年6月20日 上午1:47

    文章不错非常喜欢

    网赚活动 评论:
    2019年4月11日 上午9:39

    厉害了

    2na 评论:
    2019年5月9日 上午1:26

    哇塞,居然是沙发?留个名

    2ou 评论:
    2019年5月10日 下午4:59

    好文!转载了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注