Php fmod返回错误结果

Php fmod返回错误结果,php,floating-point,fmod,Php,Floating Point,Fmod,为什么PHP的fmod函数不能按预期工作。我错过什么了吗 fmod(2.0, 0.1); // outputs 0.1 由于2.0/0.1=20,下面的输出应为0,因此没有余数。我知道浮点数学错误,但是这个函数是专门为浮点数字设计的,所以我不知道为什么它会返回错误的结果。最接近0.1的IEEE 754 64位二进制数是0.10000000000000055115123125782702118158340451015625。比2.0大20倍。19倍,剩余0.0999999998667732370

为什么PHP的fmod函数不能按预期工作。我错过什么了吗

fmod(2.0, 0.1); // outputs 0.1

由于2.0/0.1=20,下面的输出应为0,因此没有余数。我知道浮点数学错误,但是这个函数是专门为浮点数字设计的,所以我不知道为什么它会返回错误的结果。

最接近0.1的IEEE 754 64位二进制数是0.10000000000000055115123125782702118158340451015625。比2.0大20倍。19倍,剩余0.0999999998667732370449812151491641998291015625。根据您打印剩余部分的方式,它可能会显示为“0.1”


这里的关键是,考虑到实际输入2.0和0.10000000000000055551151231257827021181583404540105625,fmod确实做了它应该做的事情。无法准确表示0.1是二进制浮点的一个众所周知的结果。

这是一个浮点不准确错误,由于此函数与IEEE754浮点一起工作,因此非常容易受到影响。。。。它是“专门为浮点数设计的”,这一点绝对没有区别。。。。这种潜在的不精确性仍然存在,请看一看。
0.1
在任何IEEE-754二进制浮点格式中都不能精确表示。所以除法是不精确的,余数也不是零。如果最接近
0.1
的浮点数略大于真实的数学值,您将看到观察到的行为,因为商的整数部分将是19,而不是20。@MarkBaker这是有意义的。奇怪的是,php文档专门调用浮点函数,却没有提到该函数在许多情况下无法正常工作。我找到了解决办法。它可能不会提供银行级精度,但在我的情况下,它不是必需的。@vascowhite不幸的是,bcmod不适用于浮动。对于小于1的小数,它将始终返回0或零除错误