为什么地球上的PHP会将(int)((0.1 + 0.7)* 10)的结果转换为7,而不是8? - php

为什么地球上的PHP会将(int) ((0.1+0.7)*10)的结果转换为7,而不是8?我知道转换为(float) 8时的结果将是(int),结果将是7?为什么会这样呢?

参考方案

关于float的全部。参见PHP: Floating point numbers:

警告-浮点精度

浮点数的精度有限。尽管它取决于系统,但是PHP通常使用IEEE 754双精度格式,由于舍入为1.11e-16的顺序,它将提供最大的相对误差。非基本算术运算可能会产生较大的错误,并且,当多个运算组合在一起时,当然必须考虑错误传播。

此外,在底数10中可精确表示为浮点数的有理数(如0.1或0.7)在底数2中没有作为浮点数的精确表示,内部使用,而不考虑尾数的大小。因此,如果不损失一点精度,就不能将它们转换为内部二进制副本。这可能导致混乱的结果:例如,floor((0.1 + 0.7)* 10)通常将返回7而不是预期的8,因为内部表示形式将类似于7.9999999999999991118...。

因此,切勿将浮点数结果信任到最后一位,也不要直接比较浮点数是否相等。如果需要更高的精度,则可以使用任意精度的数学函数和gmp函数。

补充阅读:

What Every Computer Scientist Should Know About Floating-Point Arithmetic
How dangerous is it to compare floating point values?
Why can't decimal numbers be represented exactly in binary?

在PHP中使用long int - php

我正在尝试此方法,但无法存储较大的价值$var = rand(100000000000000,999999999999999); echo $var; // prints a 9 digit value(largest possible) 如何获得期望值? 参考方案 PHP整数通常为32位。其他软件包提供了更高精度的整数:http://php.net/man…

在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java

我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…

从字符串转换为int导致精度损失时,如何抛出异常? - php

有没有一种方法可以真正检查从字符串转换为int之前或之后是否存在精度损失并引发异常?$id = "21321312412435453453453454" $numId = (int) $id; 参考方案 这应该为您工作:(只需使用php predefined constants进行比较)$id = "21321312412435…

Apache + PHP同时使用多个脚本 - php

美好的一天。首先,对不起我的英语不好=)所以。我创建了脚本:<? sleep(10); ?> 我的Apache有MPM模块,很明显我没有在此脚本中使用会话,只是..只是sleep(10)。当我在浏览器中同时打开2个标签时,第一个标签会在10秒内加载,第二个标签会在20秒内加载。但。当我同时在2个不同的浏览器中打开此脚本时,它将在10秒后加载到每个…

Xampp + Php Websocket最大执行时间错误 - javascript

这是我第一次使用它。确定尝试使用websocket ext。但我不明白:/在本文http://www.sanwebe.com/2013/05/chat-using-websocket-php-socket/中,我将其下载并解压缩到文件夹中,然后打开命令提示符执行此操作c:\xampp\php\php-cgi.exe -q c:\inetpub\wwwroot…