Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP到底在这里做什么?虫子,对吗?_Php_Math_Ceil - Fatal编程技术网

PHP到底在这里做什么?虫子,对吗?

PHP到底在这里做什么?虫子,对吗?,php,math,ceil,Php,Math,Ceil,为什么r2美元会有2027年的价值 $r1 = ceil( 10.26 * 100); //equals 1026 - CORRECT. $r2 = ceil( 20.26 * 100); //equals 2027 - WRONG! 我想出于某种原因,20.26*100不会得到一个精确的整数,但为什么??!?这不是一个错误吗?浮点数的行为方式出乎意料。谷歌发表了一篇每一位计算机科学家都应该知道的关于浮点运算的文章 基本上,计算机无法精确地处理浮点值,因此在计算中总是需要一些近似值,这

为什么r2美元会有2027年的价值

$r1 = ceil( 10.26 * 100);  //equals 1026 - CORRECT.

$r2 = ceil( 20.26 * 100);   //equals 2027 - WRONG!

我想出于某种原因,20.26*100不会得到一个精确的整数,但为什么??!?这不是一个错误吗?

浮点数的行为方式出乎意料。谷歌发表了一篇每一位计算机科学家都应该知道的关于浮点运算的文章

基本上,计算机无法精确地处理浮点值,因此在计算中总是需要一些近似值,这就是为什么永远不要将货币表示为浮点值

在您的情况下,结果如下:

20.26*100

2026.0000000000002


ceil四舍五入到最接近的整数,即2027,因此答案是正确的。

不,这不是错误。这与浮点数的精度有关。你可能知道,计算机是一台离散的机器。实数在两个实数之间有无穷多个数:计算机不可能处理无穷多的数,甚至不可能处理0.00到0.01之间的所有数例如:中间有无穷多个实数

您的计算机离散地处理实数:所有数字都四舍五入到最接近的可表示浮点数;因此,浮点数字总是包含表示错误,除非您要查找的实数可以精确表示。计算中的所有小误差都是最终误差的原因。这就是你的情况。有关更多信息和数学解释:

比如现实生活中的一个例子。只需运行这段PHP代码,看看会发生什么:

$sum = 0.0;
for ($i = 0; $i < 1000; $i++) {
    $sum += 0.1;
}
你会期望总数正好是100,对吗


关于这段代码的另一个技巧是:如果您只是使用ceil获取整数,最好使用舍入函数。

请看您是在乘以浮点数。为什么会得到一个整数?人们会期望得到一个整数,因为他调用的是返回整数的ceil。ceil从未说过它会返回整数。阅读文档。你说的可能是对的。我没有测试它。我改了。这一个显示了问题: