php - 为什么 floor(0.99999999999999999) = 1 和 floor(0.9999999999999999) = 0?

标签 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
  1. 它是否在某处定义/解释过,此时它给出了“round”值?
  2. 是否有任何函数可以给出 0 小数点后有多少个 9?

最佳答案

舍入的不是 floor,而是 float 学。

这一行:

echo 0.99999999999999999;

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

  1. Is it defined/explained somewhere, at which point it gives "round" value?

这很复杂,但数字几乎总是四舍五入。
我相信没有“从什么时候开始近似值”的定义,但这是一个数学属性,它来自 IEEE 754 floating point standard 中的定义。 .
为了安全起见,假设一切都是近似值。

  1. Is there any function which gives 0 anyhow how many 9 in decimals?

没有。问题是,对于 PHP,0.99999999999999999 实际上与 1 相同。
它们由完全相同的位序列表示,因此无法区分它们。

有一些解决方案可以处理更高精度的小数,但这需要对代码进行一些重大更改。
您可能感兴趣:

Working with large numbers in PHP

请注意,虽然您可以获得任意精度,但您永远不会获得无限精度,因为这需要无限量的存储空间。

另请注意,如果您实际上正在处理无限精度,0.999...(永远持续下去)将真正(如in,数学上可证明)等于 1,如 this Wikipedia article 中的深入解释.

关于php - 为什么 floor(0.99999999999999999) = 1 和 floor(0.9999999999999999) = 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33299408/

相关文章:

c++ - C fmod 函数 : Floating point error and optimization

php - 将 "[Remove]"链接文本更改为 WooCommerce 结账中优惠券的图标

java - Java中相同的(int)double向上和向下取整

php - php header 重定向搜索引擎友好吗?如果不是,这种情况的替代方案是什么?

CSS: Em 舍入误差

mysql 十进制舍入

floating-point - float 的 PI 和精度

Swift 3 双舍入函数

php - 从网站联系表接收电子邮件但没有内容

javascript - 如何从单独的 javascript 文件引用 PHP 变量?