2013-03-30 28 views
2

我完全意识到二进制格式的浮点数表示,所以我知道在试图用任何编程语言完美表示浮点数时,都存在数学“不可能”。但是,我希望编程语言在处理近似值时遵循一些众所周知且已建立的规则。我已经读过了(这里也是在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!

谢谢...

+3

它为什么要? –

+4

1.505000是一个近似值 – suspectus

+1

你说你知道二进制表示。尝试添加另一个“%.20f”格式,你会看到原因。 – dialer

回答

0

你应该明确地全面使用round功能,使您能够使用参数mode与值的值:

PHP_ROUND_HALF_UP -- Round val up to precision decimal places away from zero, when it is half way there. Making 1.5 into 2 and -1.5 into -2.

PHP_ROUND_HALF_DOWN -- Round val down to precision decimal places towards zero, when it is half way there. Making 1.5 into 1 and -1.5 into -1.

功能:

float round (float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]])

看到完整的描述:

http://php.net/manual/en/function.round.php

编辑:

for($i=0; $i<10; $i++) { 
    $k = 1.50 + $i/1000; 
    printf("%f %f<br>", $k, round($k,2,PHP_ROUND_HALF_UP)); 
} 
+1

我不确定这会对此有所帮助... –

+0

@OliCharlesworth使用示例用法编辑 – sharp12345

+0

但它是否给出OP的预期结果?真正的问题是,他实际上并没有1.505 ... –