为什么楼层(0.99999999999999999)= 1和楼层(0.9999999999999999)= 0?

Som*_*luk 3 php rounding floating-accuracy floor ceil

PHP中的floor函数表现得很奇怪.对于16个十进制值,它给出了底值,但是通过增加1位小数.

$int = 0.99999999999999999; 
echo floor($int); // returns 1 

$int = 0.9999999999999999; 
echo floor($int); // returns 0

$int = 0.99999999999999994; 
echo floor($int); // returns 0
Run Code Online (Sandbox Code Playgroud)
  1. 它是在某处定义/解释的,在这一点上它给出了"圆"值?
  2. 是否有任何函数0无论如何都会给出9位小数?

Sig*_*uza 14

这不是floor那个回合,它是浮点数学.

这一行:

echo 0.99999999999999999;
Run Code Online (Sandbox Code Playgroud)

打印1(演示)因为0.99999999999999999太精确而无法用(64位?)浮点数表示,所以最接近可能的值,恰好是1.
0.99999999999999994也太准确无法准确表示,但这里最接近的可表示值恰好是0.9999999999999999.

  1. 它是在某处定义/解释的,在这一点上它给出了"圆"值?

这很复杂,但数字几乎总是四舍五入.
我相信没有定义"从何时接近值",但这是一个数学属性,遵循IEEE 754浮点标准中的定义.
为了安全起见,假设一切都是近似的.

  1. 是否有任何函数给出0无论如何有多少9位小数?

不.问题是,对于PHP,0.99999999999999999字面意思是相同的1.
它们由完全相同的位序列表示,因此无法区分它们.

有一些解决方案可以使用更高精度的小数,但这需要一些主要的代码更改.
您可能感兴趣:

在PHP中使用大量数字

请注意,虽然您可能获得任意精度,但您将无法获得无限精度,因为这将需要无限量的存储.

另外请注意,如果你真的有无限的精度处理,0.999...(事情永远)是真正的(如,数学公理)等于1,如在深入解释这个维基百科文章.

  • 两个有用的链接可以更好地理解它:http://www.binaryconvert.com/result_double.html?decimal = 048046057057057057057057057057057057057057057057057057057和http://www.binaryconvert.com/result_double.html?decimal=048046057057057057057057057057057057057057057057057057 (2认同)