2011-06-03 96 views
1

我使用php解析xml和我的一個變量接收一個長十進制值。PHP長十進制數問題

$ctr = 0.00529440333938; 

但我需要使這個數字爲0.52%,所以我試着乘以100並強制只有2位小數。

$real_ctr = $ctr * 100; 
echo number_format($real_ctr, 2) . "%"; 

我得到的結果是0.00%,而不是0F 0.52%

然後我嘗試添加1只是用於測試目的

$real_ctr = $ctr + 1; 

,我得到的結果是0.005294403339381。最後加1。

任何建議如何解決此問題?

+1

有趣的是,代碼適用於我...我在我的輸出中得到0.53%。也許這是一個php版本或ini衝突嗎? – baraboom 2011-06-03 17:16:43

回答

2

它接縫$ctr你從XML解析器中得到的是一個字符串。使用:

$ctr = floatval($ctr); // or (double)$ctr; or (float)$ctr; 

確保您的變量是一個浮點數。

+0

非常感謝。字符串和floatval($ ctr)修復了這個問題 – Flavio 2011-06-03 17:36:33

+0

請注意我在這裏提到的答案 - 浮點數和數學可能會導致一些意想不到的結果! – 2011-06-03 17:50:30

4

,這是爲我工作:

$ctr = 0.00529440333938; 

$real_ctr = (double)$ctr * 100; 
$real_ctr = number_format($real_ctr, 2, ".", "") . "%"; 
$real_ctr = $ctr + 1; 

,並使用number_format($ real_ctr,2, 「」, 「」),如果你不居住在英國。

0

它被讀作字符串。你真的把它設置爲等於0.00529440333938,還是你把它設置爲等於你認爲等於0.00529440333938的東西?賦值語句後,試試這個,看看它是否工作:

$ctr = floatval($ctr); 
+0

非常感謝很多人的快速響應,好像它的價值似乎是字符串和floatval($ ctr)解決了這個問題。 – Flavio 2011-06-03 17:34:31

1

浮點和雙類型變量的性質是,他們無法在去年位數精度的依據。查看說明書:http://php.net/manual/en/language.types.float.php

在使用它們之前理解浮動很重要 - 如果您正在進行任何類型的財務計算,浮動會由於它們固有的不精確性而給您帶來意想不到的結果。如果你需要精確的結果,你最好堅持雙打,尤其是,如果你正在處理與金錢有關的任何事情。

因此,請確保您使用的是您期望的號碼類型。由於PHP的寬鬆輸入,你遇到了將你的號碼變成float/double的問題。查看關於類型雜耍的文檔:http://www.php.net/manual/en/language.types.type-juggling.php,那裏可能有一些有用的信息。

基本上,你需要確保你的數字在整個計算過程中保持整數,你需要防止PHP爲你「決定」這個類型,查看intval或者BC精度數學函數if你需要深入:http://www.php.net/manual/en/ref.bc.php