2011-03-01 223 views

回答

49

PHP允許負精度round諸如具有:

$x = round ($x, -3); // Uses default mode of PHP_ROUND_HALF_UP. 

而正精度指示在何處後四捨五入小數點,負精度提供相同功率之前的小數點。所以:

n round(1111.1111,n) 
== ================== 
3 1111.111 
2 1111.11 
1 1111.1 
0 1111 
-1 1110 
-2 1100 
-3 1000 

作爲一個通用的解決方案,即使沒有它內置的語言,你只需做這樣的事情:

  • 添加500
  • 將它除以1000(如果需要,截斷爲整數)。
  • 乘以1000

這當然假設你想要PHP_ROUND_HALF_UP的行爲。有些人認爲銀行家四捨五入,PHP_ROUND_HALF_EVEN,更好地減少累積誤差,但這是另一個問題的主題。

+0

添加499,或添加500? 500不應該增加到1000? – Mikel 2011-03-01 03:07:40

+0

@Mikel:是的,我的錯誤,修復,謝謝。 – paxdiablo 2011-03-01 03:09:19

4

使用由其他海報round($number, -3)提到round function

您也可以將您的號碼除以1,000,圓到最接近的整數然後乘以1,000。另外,如果你想要四捨五入,你可以除以1,000,否定商,將它強制爲一個整數,再次否定它,然後乘以1,000。

3

對於正整數:

function round($var) { 
    return ($var + 500)/1000 * 1000; 
} 
+4

不能重新宣佈輪() – Jacob 2011-03-01 03:26:07

+3

OP要求它被稱爲'round()'。如果它已經存在,就把它叫做別的! ;-) – Mikel 2011-03-01 03:53:57

2

剛剛從Mikel answer您的信息簡單的計算比round()快:

Test name  Repeats   Result   Performance  
calculation  10000   0.030229 sec +0.00% 
round   10000   0.040981 sec -35.57% 

測試源here

2

只是一個小小的改變,可能有助於圓滿!

$x = ceil(220.20/1000) * 1000; 
echo $x; 
2

這裏的圍捕下一個千年的答案:

abs(round(($a - 500), -3)) . "\n";

500-999然後輪0和1000-1999輪1000等

如果您想要它在1000開始,然後只是做

abs(round(($a + 500), -3)) . "\n";

乾杯!