公司的一个商城项目,对于资金这一块,遇见了一个大坑!


PHP

1
2
> var_dump(intval(0.58 * 100));
< 57

JS

1
2
> 0.1+0.2
< 0.30000000000000004

全是浮点运算惹的祸

其实这些结果都并非语言的 bug,但和语言的实现原理有关, js 所有数字统一为 Number, 包括整形实际上全都是双精度(double)类型。

而PHP会区分 int 还是 float。不管什么语言,只要涉及浮点运算,都是存在类似的问题,使用时一定要注意。

说明:如果用php的+-*/计算浮点数的时候,可能会遇到一些计算结果错误的问题,比如上面 的 echo intval( 0.58*100 );会打印57,而不是58,这个其实是计算机底层二进制无法精确表示浮点数的一个bug,是跨语言的。所以基本上大部分语言都提供了精准计算的类库或函数库,比如php有BC高精确度函数库。

函数名 介绍
bcadd 将两个高精度数字相加
bccomp 比较两个高精度数字,返回-1, 0, 1
bcdiv 将两个高精度数字相除
bcmod 求高精度数字余数
bcmul 将两个高精度数字相乘
bcpow 求高精度数字乘方
bcpowmod 求高精度数字乘方求模,数论里非常常用
bcscale 配置默认小数点位数,相当于就是Linux bc中的”scale=”
bcsqrt 求高精度数字平方根
bcsub 将两个高精度数字相减

原文章网址:https://www.cnblogs.com/phpper/p/7664069.html