我完全意识到二进制格式的浮点数表示,所以我知道在试图用任何编程语言完美表示浮点数时,都存在数学“不可能”。但是,我希望编程语言在处理近似值时遵循一些众所周知且已建立的规则。我已经读过了(这里也是在stackoverflow中)printf在PHP中可能是“正确地截断/近似”一个数字的最好方法,而且 - 再次 - 我完全意识到,我可以轻松地编写一个线性函数给我“完美”的近似值。这只是为了避免像“为什么你不使用XXX或做YYY?”这样的答案。使用printf进行PHP错误近似
尝试这种情况:
for($i=0; $i<10; $i++) {
$k = 1.50 + $i/1000;
printf("%f %.2f<br>", $k, $k);
}
这是输出:
1.500000 1.50
1.501000 1.50
1.502000 1.50
1.503000 1.50
1.504000 1.50
1.505000 1.50
1.5 06000 1.51
1.507000 1.51
1.508000 1.51
1.509000 1.51
正如你可以很容易地看到,1.504是(正确地)打印为1.50,1.506是(正确地)打印为1.51。 但为什么1.505打印为1.50?它必须是1.51,而不是1.50!
谢谢...
它为什么要? –
1.505000是一个近似值 – suspectus
你说你知道二进制表示。尝试添加另一个“%.20f”格式,你会看到原因。 – dialer