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

  浮点数, 以64位的长度(双精度)为例, 会采用1位符号位(E), 11指数位(Q), 52位尾数(M)表示(一共64位).

  符号位:最高位表示数据的正负,0表示正数,1表示负数.

  指数位:表示数据以2为底的幂,指数采用偏移码表示.

  尾数:表示数据小数点后的有效数字.

  小数在二进制的表示, 0.58 对于二进制表示来说, 是无限长的值
  0.58的二进制表示基本上(52位)是: 00101000111101011100001010001111010111000010100011110.57的二进制表示基本上(52位)是: 001000111101011100001010001111010111000010100011110而两者的二进制, 如果只是通过这52位计算的话,分别是:0.58 -> 0.579999999999999960.57 -> 0.5699999999999999至于0.58 100的具体浮点数乘法, 0.58 100 = 57.999999999,那intval的结果自然是57。
这个问题的关键点在于: “看似有穷的小数, 在计算机的二进制表示里却是无穷的”。
常用的高精度函数:

最后修改:2020 年 11 月 20 日 02 : 29 PM