2012-06-06 62 views
12

當我做在PHP以下乘法:顯示浮點值的w/o科學記數法

$ret = 1.0 * 0.000000001; 

我得到的結果是:1.0E-9

我想這個結果轉換成十進制正常記譜法,我怎麼能做到這一點?

sprintf('%f',$ret)不起作用,它返回0.000000。溢出?

回答

30

sprintf('%f',$ret)不起作用,它返回0.000000。溢出?

sprintf工程,但是你錯過了這裏的一些觀點。

0.000000不溢出。這只是sprintf對於%f修飾符默認情況下使用6位數字。請注意,%f是現場感知,%F可能更適合。

您可能想要使用更多數字,例如讓我們說400萬(400萬):

$ php -r "printf('%.4000000F', 1*0.000000001);" 

Notice: printf(): Requested precision of 4000000 digits was truncated to PHP maximum of 53 digits in Command line code on line 1 

Call Stack: 
    0.0001  319080 1. {main}() Command line code:0 
    0.0001  319200 2. printf() Command line code:1 

0.00000000100000000000000006228159145777985641889706869 

這個例子說明,存在不僅是一種常見的值(6位數字),而且最大的(可能依賴於計算機系統PHP執行上),在這裏正如警告所示,在我的情況下截斷爲53位數字。

因爲你的問題我說你想要顯示:

0.000000001 

哪些是九位,所以你需要它這樣寫:

sprintf('%.9F',$ret) 

但是,您可能希望要做到這一點:

rtrim(sprintf('%.20F', $ret), '0'); 

將從事後收屍零:

0.000000001 

希望這是有幫助的。

+0

你是老大。一直在整個互聯網上尋找這個。 – Peibol

+1

當我找到這個答案後,我花了一些時間進行研究,這是最好的答案。你可以自由地使用它們。 – Kainax

+0

使用'sprintf'頂部的'rtrim'就像一個魅力。 –

7

您需要添加精度說明符(應該爲浮點數顯示多少個小數位數)。事情是這樣的:

echo sprintf('%.10f',$ret); // 0.0000000010 

如果你不知道什麼號碼,你應該指定,只要給它一個很大的數字,並與rtrim()結合起來。

echo rtrim(sprintf('%.20f', $ret), '0'); // 0.000000001 

上述代碼將從字符串的末尾中去掉任何0的。

4

我建議使用BCMath爲更準確,當你用十進制數進行計算。這確保你實際得到你想要的結果。

要打印您想要的內容,應該指定精度並使用%.9f,因爲它默認顯示6個十進制數。這使得它是這樣的(就像bsdnoobz已經說過):

sprintf('%.9f',$ret); 
+0

問題是我從各種精度的數據庫中獲取所有這些數字。 – Johni

+0

儘管如此,當您使用浮點數時,結果可能與您所期望的不同。如果需要精度,請使用BCMath。如果你不在乎是否在某處添加了一個.000000001(或類似的東西),那麼使用浮動就可以。 – ralphje

3

要與系統的設置和限制保持一致,您可以使用serialize_precision以獲得最準確的結果。

echo rtrim(sprintf('%.'.ini_get('serialize_precision').'f', $ret)); 

我不建議使用非語言環境感知%F因爲你的問題纔有意義,爲了顯示的目的。尊重語言環境可以提供更好的用戶體驗。