2011-10-10 139 views
1

我想使用PHP的round()函數向下舍入一個數字。這裏是我使用的代碼:意外的回合()返回

$line_item_price = 13.775; 

echo round($line_item_price, 2, PHP_ROUND_HALF_DOWN); 

現在,當我運行這樣的代碼,我希望能得到輸出13.77,除非我得到0(或沒有 - 不知道這還)。

現在,當我刪除PHP_ROUND_HALF_DOWN時,我得到13.78。有人看到我在這裏做錯了嗎?看起來這應該工作正常。

+0

你至少運行PHP 5.3嗎? –

+0

我正在運行5.2.10 –

+4

模式參數是在5.3版本中引入的,因此它不適用於您。你必須找到一個自定義函數來做你正在尋找的東西。 –

回答

3

模式參數是在5.3版本中引入的,因此它不適用於您。你必須找到一個自定義函數來做你正在尋找的東西。

0

你能不能只是做:

echo round($line_item_price, 2) 

我不是100%確定,但我認爲ROUND_HALF_DOWN等是分數,如1.5,2.5和整數。

+1

這給了我13.78。我想要13.77。 –

+0

我的歉意,給我一點時間 – martincarlin87

+0

我能想到的唯一事情就是檢查變量的最後一位是否是5,如果是這樣,你可以刪除它。不知道這對你是否有用。 – martincarlin87

1

您正在使用當前版本的PHP中尚未提供的函數。解決此問題的一種方法是使用floor函數。

$line_item_price = 13.775; 
echo floor($line_item_price * 100)/100; 

我在這裏做的事情是先將數值乘以100,然後確定數值。這會給你一個向下取整數值爲2。精準然後讓你需要100

100來自power(10, desired precision)

0

這裏是一個辦法做到這一點的數量devide正確的值:

$num = 13.775; 
$tmp = intval($num*1000); 
$dec = $tmp % 10; 
if ($dec > 5) { 
    $rounded = (1+intval($tmp/10))/100; 
} else { 
    $rounded = intval($tmp/10)/100; 
} 
echo $rounded,"\n"; 

這給:13.77$num=13.77513.78$num=13.776

0

其實,我有點驚訝的是,它在所有工作,自號13.775無噸浮點精確表示:

$ php -r 'printf("%.40f\n", 13.775);' 
13.7750000000000003552713678800500929355621 

事實上,似乎round()有點鬆懈「半」什麼罪名:

$ php -r 'echo round(13.77500000000001, 2, PHP_ROUND_HALF_DOWN) . "\n";' 
13.77 

無論如何,如果你的PHP不支持PHP_ROUND_HALF_DOWN,這裏有一個簡單的克魯格給出大致相同的功能:

function round_half_down ($num, $digits) { 
    $mul = pow(10, $digits); 
    return ceil($num * $mul - 0.5)/$mul; 
} 

這不變成工作的人會天真地想到,卻是嚴格一些比round()round_half_down(13.775, 2) == 13.77,但是round_half_down(13.77500000000001, 2) == 13.78。此外,作爲一個奇怪的邊緣情況下,round_half_down(0.001, 2)返回-0。如果你不喜歡這個,你可以通過sprintf("%.{$digits}F")來傳遞返回值以很好地格式化它。