2013-03-01 51 views
3

我有一個小問題round()在PHP中。 我不知道,如果我真的說得對。 (它是一個訂單系統)如何整數金額正確? #Update 1

$量可以是十進制14,8 $價格可以是十進制10,5(數據庫)

我使用下面的這一刻 的$四捨五入價格爲一美元的金額

function round_amount($amount) { 
    return (float) round($amount, 8); 
} 

function round_price($amount) { 
    return (float) round($amount, 5); 
} 

//if some one have more decimal chars like 10.000000009 
round_amount(10.000000009); //will be 10.00000001 

//if some one have more decimal chars like 10.000009 
round_price(10.000009); //will be 10.00001 

//also this is possible 
round_price(round_amount(10.000000009)*round_price(10.000009)) 

這種方式正確使用輪嗎? 某些用戶正在使用16位以上的小數。 我在用戶數據庫中扣除/添加結果。

但是我看到,有些用戶大概有5-10分錢!

解決此問題的唯一方法是隻允許8位和5位小數? 並警告用戶,如果他試圖使用更多? 但比我會得到與round_cur的問題(round_amount(10.000000009)* round_cur(10.000009))

我希望有人明白我的意思,或者可以告訴我,如果我的方式圓是正確的。

更新1

$amount = 10.12398413498579889173459873; 
$price = 5.1938457198347695; 

echo round_cur(round_amount($amount)*round_cur($price))."<br />"; 
echo round_cur($amount*$price); 

//returns 
//52.58245 
//52.58241 

有趣!

+2

什麼是round_cur(round_amount(10.000000009)* round_cur(10.000009))?你的意思是round_price? – MIIB 2013-03-01 19:44:16

+0

當然,改變了!對不起 – DjangoSi 2013-03-01 19:45:44

+0

我真的取決於你的使用情況。例如,您似乎很奇怪,儘管你提了'round_cur'功能,但不顯示的定義和你的'round_amount(10.0000009)'例子應該返回10.0000009因爲傳遞給函數的值比'round_amount'函數指定精度要求不高。現在,無論是乘號在一起,然後他們周圍還是以首輪他們是嚴格意義上的商業邏輯的決定。 – 2013-03-01 19:49:00

回答

-8

我認爲你的方式是正確的,但如你所說,取決於你的情況,這兩個公式會返回不同的值,你是項目經理,哪個系統更適合你(你應該考慮什麼是最適合你,什麼是最好的用戶,讓你的心,看看你是否選擇使用,會是什麼行業),並針對這種情況我建議第一methid

round_price(round_amount(x)*round_price(y)) 

併爲您的問題的好通知或警告應該這樣做。給用戶一個例子。

+9

這實際上是非法的。你無法整理財務數據。 – 2013-04-19 18:27:05

1

爲什麼不保留來自數據庫的實際值緩存,然後有一個單獨的變量顯示。通過這種方式,所有計算都可以在緩存的正確值的同時完成,同時保持乾淨的用戶界面。每次更新緩存變量時,確保更新顯示的變量。

另外,在做任何舍入之前總是應用數學。乘以兩個精確數字要比乘以兩個舍入數字精確得多。這適用於數學中的每一個操作。因此,加,減,除,乘,然後舍入,但不要將該舍入數用於另一個公式。使用以前的確切數字。

+0

在浮點世界中,沒有普遍的「兩個確切數字」這樣的東西。而且,你錯過了這一點。 – 2014-02-15 13:32:53