javascript0.1 + 0.2 为啥不等于 0.3 ? (正确结果:0.30000000000000004)
0.8 * 7 为啥不等于 5.6 ? (正确结果:5.6000000000000005)
phpvar_dump(intval(0.58 * 100));
正确结果是 57,而不是 58
浮点运算惹的祸其实这些结果都并非语言的 bug,但和语言的实现原理有关, js 所有数字统一为 number, 包括整形实际上全都是双精度(double)类型。
而php会区分 int 还是 float。不管什么语言,只要涉及浮点运算,都是存在类似的问题,使用时一定要注意。
浮点二进制原理根据国际标准ieee 754,任意一个二进制浮点数v可以表示成下面的形式:
v = (-1)s * m * e
1. (-1)s 表示符号位,当s=0,v为正数;当s=1,v为负数。
2. m表示有效数字,大于等于1,小于2。
3. 2e 表示指数位。
举例来说:十进制的-5.0,写成二进制是-101.0,相当于-1.01×22 。那么,s=1,m=1.01,e=2。
ieee 754规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数e,剩下的23位为有效数字m。
对于64位的浮点数,最高的1位是符号位s,接着的11位是指数e,剩下的52位为有效数字m。
ieee 754对有效数字m和指数e,还有一些特别规定。
前面说过,1≤m0e895a4342722933aba05d0b89f9b5d0
以上就是有关 php 和 js 浮点运算的问题的详细内容。