2013-11-09 73 views
6

我從數據庫中得到一個數字,這個數字可能是floatint

我需要數的小數精度設置爲3,這使得不超過(關於小數)5.0201518845.756數量。在PHP中設置浮點數的精度

使用PHP

round($number, $precision) 

我看到一個問題:

這輪數。我需要一個函數來減小小數點,而不改變它們的值,round()似乎沒有遵循。

回答

12

您可以使用number_format()來實現這一目標:

​​3210

這將轉換1518845.7567891518845.757

但如果你只是想小數數切斷短至3,和,那麼你就可以做到以下幾點:

$number = intval($number * ($p = pow(10, $precision)))/$p; 

它可能首先看嚇人,但這個概念非常簡單。你有一個數字,你乘以10 (它變成1518845756.789),將其轉換爲一個整數,因此在小數點後3位的所有數據都被刪除(變成1518845756),然後除以10 1518845.756)。

Demo

+1

這不工作,如果'INTVAL($數*($ P ...))'不能表示爲整數。例如:'$ number = 10000000; $ precision = 3;'在32位機器上產生'1410065.408'。 –

+0

@NisseEngström我不知道你在做什麼,因爲你從一個整數開始,並以廢話結束...... – arod

+2

@arod:這是*我的*點。如果* number *×*乘數*太大而不能表示爲整數,那麼最終會導致無意義。在64位機器上,你需要更大的數字和精度來結束無意義的值。 –

6

其聲如floor與小數。所以,你可以嘗試這樣

floor($number*1000)/1000 
+0

可能是最快的一個? – Hafenkranich

2

如果我理解正確的話,你不會想四捨五入發生,你想的精度爲3。

這樣的想法是使用number_format()爲精密4,然後刪除最後一個數字:

$number = '1518845.756789'; 
$precision = 3; 

echo substr(number_format($number, $precision+1, '.', ''), 0, -1); 

顯示:

1518845.756 

,而不是:

1518845.757 

鏈接:number_format()substr()

+0

如果第4個小數點是「9」,並且第5個小數點將導致它翻轉,則這將不起作用。例如,用'$ number ='0.00096''來嘗試。 –