2013-11-09 24 views
6

Veritabanından bir sayı alıyorum ve bu sayı float veya int olabilir.

ben daha 5.020 veya 1518845.756 (ondalık ilişkin) uzun olmayan sayı yapar 3 e sayının ondalık hassasiyet ayarlamanız gerekir.PHP'de bir float numarası için hassaslık ayarlayın

Bu sayı yuvarlar:

round($number, $precision) 

PHP

kullanma

Bir sorun görüyorum. Sadece ondalıklarını kestirmek için bir fonksiyona ihtiyacım var, round()'un takip etmediği değerleri değiştirmeden.

cevap

12

Sen bunu başarmak için number_format() kullanabilirsiniz:

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

Bu 1518845.757 için 1518845.756789 dönüştürmek istiyorum.

Ama sadece değil yuvarlak kısa 3'e ondalık basamak sayısını kesmek istiyor ve eğer, o zaman aşağıdakileri yapabilirsiniz:

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

O görünebilir ilk başta korkutucu, ama kavram gerçekten çok basit. Bir numaranız var, onu 10 (1518845756.789 olur) ile çarpın, bir tamsayıya dönüştürün, böylece 3 ondalık basamaktan sonra her şey kaldırılır (1518845756 olur) ve ardından sonucu 10 olarak böler. 1518845.756). ondalık ile floor gibi

Demo

+1

Bu ise 'intval ($ numarasını * ($ p ...)) çalışmıyor' bir tamsayı olarak temsil edilemez. Örneğin: '$ number = 10000000; $ precision = 3; '32 bitlik bir makinede' '1410065.408' sonucunu verir. –

+0

@ NisseEngström Ne yaptığınızı bilmiyorum, bir tamsayıyla başladığınız ve saçma sapanlarla bittiğinizden beri ... – arod

+2

@arod: Bu * benim * noktanız. * Sayı * × * çarpanı * tamsayı olarak gösterilemeyecek kadar büyükse, o zaman saçmalıklarla sonlanırsınız.64 bitlik bir makinede, anlamsız değerlerle sonuçlanmak için daha büyük sayılara ve hassasiyete ihtiyacınız vardır. –

6

Onun sesi. Yani Doğru anladıysam, sen oluşmaya yuvarlama istemem

floor($number*1000)/1000 
+0

muhtemelen en hızlı olanı? – Hafenkranich

2

gibi bir şey deneyebilir ve hassas 3.

Yani fikri bir hassasiyet için number_format() kullanmaktır olmak isterdim 4 ve daha sonra son rakamı kaldırın:

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

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

Will display:

1518845.756 

ziyade:

1518845.757 

Bağlantılar: number_format(), substr()

+0

Dördüncü ondalık bir "9" ise ve 5. ondalık dönmesine neden olursa, bu çalışmaz. Örneğin, '$ number =' 0.00096 'ile deneyin. –

İlgili konular