2013-11-09 11 views
6

Ricevo un numero dal database e questo numero può essere sia float o int.

ho bisogno di impostare la precisione decimale del numero di 3, il che rende il numero non superiore a (per quanto riguarda decimali) 5.020 o 1518845.756.Imposta la precisione per un numero float in PHP

Utilizzo di PHP

round($number, $precision) 

vedo un problema:

Si arrotonda il numero. Ho bisogno di una funzione per tagliare solo i decimali in breve, senza cambiare i loro valori che non sembra che round() segua.

risposta

12

È possibile utilizzare number_format() per raggiungere questo obiettivo:

echo number_format((float) $number, $precision, '.', ''); 

Ciò convertire 1518845.756789 a 1518845.757.

Ma se si desidera solo per tagliare il numero di cifre decimali breve per 3, e non rotonda, allora si può fare quanto segue:

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

Può sembrare intimidatorio in un primo momento, ma il concetto è davvero semplice. Hai un numero, moltiplicarlo per 10 (diventa 1518845756.789), gettato in un numero intero in modo tutto dopo le 3 cifre decimali viene rimosso (diventa 1518845756), e poi dividere il risultato per 10 (diventa 1518845.756).

Demo

+1

Questo non funziona se 'intval ($ numero * ($ p ...))' non possono essere rappresentati come un intero. Ad esempio: '$ numero = 10000000; $ precision = 3; 'produce' 1410065.408' su una macchina a 32 bit. –

+0

@ NisseEngström Non so cosa stai facendo, dal momento che inizi con un numero intero e finisci con cose senza senso ... – arod

+2

@arod: Questo è * il mio * punto. Se * numero * × * moltiplicatore * è troppo grande per essere rappresentato come un numero intero, allora si finisce con una sciocchezza.Su una macchina a 64 bit, sono necessari numeri e precisione maggiori per ottenere valori senza senso. –

6

suo suono come floor con i decimali. Così si può provare qualcosa di simile

floor($number*1000)/1000 
+0

probabilmente il più veloce? – Hafenkranich

2

Se ho capito bene, non si vuole l'arrotondamento a verificarsi e si vorrebbe la precisione di essere 3.

Così l'idea è quella di utilizzare number_format() per una precisione di 4 e quindi rimuovere l'ultima cifra: visualizzazione

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

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

Will:

1518845.756 

, piuttosto che:

1518845.757 

vicini: number_format(), substr()

+0

Questo non funziona se il 4 ° decimale è un '9' e il 5 ° decimale lo fa rotolare. Provalo con '$ numero = '0.00096'' per esempio. –