2017-10-17 67 views
-1

我正在處理一個處理monetairy金額的PHP腳本,因此需要精確到2位小數。爲此,我將用戶輸入轉換爲一個數字,並將其乘以100,然後將其轉換爲int。這工作正常,直到我最近發現一個數字,當投到int時增加1。PHP(int)生成錯誤的數字

的故障代碼:

$number = (int)(str_replace(',','.',$_POST["input"])*100); 

,讓問題的數量2509,22(我住在荷蘭,所以我們使用逗號爲小數,因此在上面的代碼行的str_replace函數)。 該值創建整數$ number 250921,顯然是1太低。 我知道,INT是有限制的,但這個數字是很好的限制之內就我所知...

+0

爲什麼你需要將它設置爲int?這樣做的目的是什麼?這個int旁邊會發生什麼? – Andreas

+0

我使用它來確保輸入不包含2位以上的小數。如前所述,這是財務信息,這是爲了防止用戶在金融系統中輸入小於可能的分數。 – Discoverer

+1

改爲使用bcmath。除非您完全確定輸出結果並通過代碼判斷,否則絕對不要使用浮點操作,我相信您不會。您可以在這裏閱讀更多關於浮點數精度的信息http://php.net/manual/en/language.types.float.php –

回答

-1

當你乘以100號,你實際上並沒有得到250922但sometging littlebit較低(250921,999 ....)

(int)每次向下取整,因此您需要在「int-ing」之前輪換:

$number = intval(round(str_replace(',','.',"2509,22")*100)); 
+0

這是個竅門。在其他回覆中,我已經知道2809.22 * 100導致他浮點數250921.99999999997,並且當直接轉換爲int時,小數點被丟棄。你添加的「圓」解決了這個問題。 – Discoverer

+0

不,圓不解決'2509,225'變成'250923'。 – AbraCadaver

2

當您100乘以字符串你得到一個float其表示並不總是你的期望在這種情況下,250921.99999999997。與看它:

echo serialize(str_replace(',','.','2509,22')*100); 

然後你施放一個integer其trucates分數獲得250921。見Is floating point math broken?

的解決辦法是刪除逗號並使用如和可選強制轉換爲integer

$number = (int)str_replace(',', '', '2509,22'); 

對於進入太多小數用戶的問題,您應該使用兩個輸入,一個用於整數和一個分數和/或限制/驗證輸入格式正確。但是,您可以先格式化數字:

echo $number = (number_format(str_replace(',', '.', '2509,22'), 2, '.', '')*100); 
+0

好的,謝謝!和整數只是把它放下我猜。你知道我應該用什麼類型的演員來獲得正確的電話號碼嗎? – Discoverer

+1

因爲當用戶多次點擊一個按鈕(所以他把2509222放在輸入框中)時,將被存儲的數字將會太高。 – Discoverer

+0

@發現者1)如果在小數點後有兩位數以上的數字(或逗號:),則拒絕輸入。2)在繼續和/或允許撤消方法之前,向客戶端提供驗證值。用戶可能無意中使用了「錯誤的」分隔符*和*鍵入一個額外的數字。 – user2864740

0

您可以使用正則表達式來匹配int和零 - 兩位小數。
這不會做任何轉換,也不會增加或轉換任何東西。
它將被視爲一個字符串,沒有任何變化,但小數的數量。

$input = "2509,2222222"; 
// Regex number comma number (zero - two) 
Preg_match("/(\d+),*(\d{0,2})/", $input, $m); 
Unset($m[0]); // remove full match 

Echo implode("", $m); // implode parts 

https://3v4l.org/MjcYV

+0

問題是數字也應該被允許以點而不是逗號輸入。當然,你也可以刪除它,但是當用戶輸入錯誤的數量時(比如2509,222點擊按鈕的次數太多),那麼金額會是2509222,這太高了。 – Discoverer

+0

這確實可行。就我個人而言,我認爲我將使用David Bubenik建議的解決方案,因爲這也允許輸入數字而不會有任何小數。用戶在他們的方式並不是很精確,所以我試圖儘可能靈活,但謝謝你的建議! – Discoverer

+0

@發現者的傢伙。當您發佈問題時,請發佈我們需要的所有信息以幫助您。你不斷添加信息,這真的很煩人。 – Andreas