可能重复:
为什么十进制数不能用二进制表示?
浮动值的问题
$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和>而不是==来做.原油而不是世界上最好的代码,但确实解决了原始问题.感谢大家,我将阅读其他回复并跟进以改进我的编码.
再一次,非常感谢.
计算机无法准确表示浮点数,因为它们存储在二进制(基数2)中.所有浮子都会有一点点调整+/-.
请参见:http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
这个给出了预期的结果:
$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)