公司的一个商城项目,对于资金这一块,遇见了一个大坑!
PHP
1 | > var_dump(intval(0.58 * 100)); |
JS
1 | > 0.1+0.2 |
全是浮点运算惹的祸
其实这些结果都并非语言的 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 | 将两个高精度数字相减 |