最近在处理两位小数时,发现乘以100之后,再使用php intval函数会比预料结果少1echo intval(0.58*100);
//输出 57
以为是bug,后来找到了鸟哥的解释
浮点数的表示:
浮点数, 以64位的长度(双精度)为例, 会采用1位符号位(E), 11指数位(Q), 52位尾数(M)表示(一共64位).
符号位:最高位表示数据的正负,0表示正数,1表示负数。
指数位:表示数据以2为底的幂,指数采用偏移码表示
尾数:表示数据小数点后的有效数字.0.58的二进制表示基本上(52位)是: 0010100011110101110000101000111101011100001010001111
0.57的二进制表示基本上(52位)是: 0010001111010111000010100011110101110000101000111101
而两者的二进制, 如果只是通过这52位计算的话,分别是:0.58 -> 0.57999999999999996
0.57 -> 0.56999999999999995
如果避免这种错误,则需要使用strval函数$num="0.58";
echo intval($n*100); //输出 57
echo intval(strval($n*100)); // 输出 58