带小数点的高精度运算

前段日子,组长在写一个学科测试的排名逻辑,也不知怎么的,就涉及了大量的小数运算,可能乘上一个小数,然后再除了很大的数字,但是最后的结果,php只给了一个整数,而忽略了小数。然后组长问我,我也一脸懵逼的。于是从网上找呀找,得知高精度运算时,可以使用bc库带的一些高精度的运算方法,如下:(复制过来的)

bcadd — 将两个高精度数字相加 
bccomp — 比较两个高精度数字,返回-1, 0, 1 
bcdiv — 将两个高精度数字相除 
bcmod — 求高精度数字余数 
bcmul — 将两个高精度数字相乘 
bcpow — 求高精度数字乘方 
bcpowmod — 求高精度数字乘方求模,数论里非常常用 
bcscale — 配置默认小数点位数
bcsqrt — 求高精度数字平方根 
bcsub — 将两个高精度数字相减

于是我自己做了一些测试,如下:
带小数点的高精度运算_第1张图片

可以看到的是,当php的浮点数长度装不下这串数字时,自动转换成了字符串类型。
这里我总结了几个点:

  1. bc等函数的第三个参数,用来控制小数点后的位数(这个可以在手册中查到),如果用来做加减乘除等高精度运算,这个参数还是很必要的,但是又有所区别。例如,在乘法运算中,我bcmul设置的是30位小数,显然结果中并没有30位。所以乘法中,设置的小数位数,如果实际结果没有那么多,也不会自动补零,而是直接展示最终结果。但是像除法,如果设置的位数过大,后面会自动补零。

  2. 如果你的数字长度过长,甚至超出浮点类型的长度,可以使用字符串,也就是用“”将数字括起来。

  3. 在图示中的除法,除数若是整数,最大长度是14位(100000000000000,好像是写了14个0吧QAQ),超过此长度,结果是null。

  4. 只要你有一处用了高精度运算,其他的运算也尽量保持使用高精度运算。不然结果,可能还是个整数QAQ。

以上是个人的拙见,可能有不对的地方,欢迎指正。

你可能感兴趣的:(php基础)