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)
0无论如何都会给出9位小数?Sig*_*uza 14
这不是floor那个回合,它是浮点数学.
这一行:
echo 0.99999999999999999;
Run Code Online (Sandbox Code Playgroud)
打印1(演示)因为0.99999999999999999太精确而无法用(64位?)浮点数表示,所以最接近可能的值,恰好是1.
0.99999999999999994也太准确无法准确表示,但这里最接近的可表示值恰好是0.9999999999999999.
- 它是在某处定义/解释的,在这一点上它给出了"圆"值?
这很复杂,但数字几乎总是四舍五入.
我相信没有定义"从何时接近值",但这是一个数学属性,遵循IEEE 754浮点标准中的定义.
为了安全起见,假设一切都是近似的.
- 是否有任何函数给出0无论如何有多少9位小数?
不.问题是,对于PHP,0.99999999999999999字面意思是相同的1.
它们由完全相同的位序列表示,因此无法区分它们.
有一些解决方案可以使用更高精度的小数,但这需要一些主要的代码更改.
您可能感兴趣:
请注意,虽然您可能获得任意精度,但您将无法获得无限精度,因为这将需要无限量的存储.
另外请注意,如果你真的是有无限的精度处理,0.999...(事情永远)是真正的(如,数学公理)等于1,如在深入解释这个维基百科文章.
| 归档时间: |
|
| 查看次数: |
688 次 |
| 最近记录: |