基本数学的PHP浮点错误

Dor*_*jan 6 php math

可能重复:
为什么十进制数不能用二进制表示?
浮动值的问题

$var1 = 1;

for ( $i=0; $i<30; $i++ ) {
  $var1 += 0.1;
  $var2 = floor($var1);
  $var3 = $var1-$var2;
  if ( $var3 == 0.5 ) {
    $var1 = $var2+1;
  }
}
Run Code Online (Sandbox Code Playgroud)

这个循环的意图是计算1.0,1.1,1.2,1.3,1.4,然后跳到2.0,2.1,2.2等

我得到的问题是if声明永远不会成立.每十分之一的计算也解决了一些疯狂的科学答案.

我该如何解决?请帮忙!

编辑:我写了一个令人沮丧的匆忙的问题,这不止一个,我现在看到了.

问题的第一部分实际上是"我怎样才能通过这个浮点查询来完成这项工作"和"为什么这个问题甚至会发生!"

感谢所有好的回复,我将答案正确,这很容易回答"如何使这项工作"的核心问题.

用0.49而不是0.5和>而不是==来做.原油而不是世界上最好的代码,但确实解决了原始问题.感谢大家,我将阅读其他回复并跟进以改进我的编码.

再一次,非常感谢.

Jos*_*osh 5

计算机无法准确表示浮点数,因为它们存储在二进制(基数2)中.所有浮子都会有一点点调整+/-.

请参见:http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm


Sta*_*ano 5

这个给出了预期的结果:

$var1 = 1;
for ( $i=0; $i<30; $i++ ) {
    $var1 += 0.1;
    $var2 = (int)($var1);
    $var3 = $var1-$var2;
    if ( $var3 >= 0.45 ) {
        $var1 = $var2+1;
    }
    echo $var1.' '.$var2.' '.$var3.'<br/>';
}
Run Code Online (Sandbox Code Playgroud)

  • 我把它当作正确的答案,因为它使用我的代码完全指明了一个快速简便的解决方案.我已经投了所有其他答案,因为他们处理为什么.我稍后会再次访问,但是我现在没有太多时间. (2认同)