2017-08-23 29 views
0

我在數據庫中保留一個有十進制類型的字段。如何在PHP中輸入decimal?

我該如何輸入?

public function getPrice() : decimal 
{ 
    $temp = 123.45; 
    return $temp; 
} 

它是不工作的,因爲回報:

致命錯誤:未捕獲的類型錯誤:用getPrice的返回值()必須是十進制的一個實例,花車返回。

無論如何類型十進制不存在。

我可以使用浮動的打字,但這是安全和良好的?重點在於浮球式可能存在數字錯誤(Float or decimal for prices?)。

+1

所以改變看看。這將比提問更快。 –

+1

只需將其聲明爲浮點返回值?函數getPrice():float {' – Qirel

+0

在返回語句之前嘗試四捨五入($ temp)。 http://php.net/manual/en/function.round.php –

回答

0

別擔心... Float是好的,是安全的。

如果您的價格長於小數點後十位,您沒事。

但是:

永遠不要相信浮點數結果精確到了最後一位,也不要直接用於相等比較浮點數。

浮點數的精度有限。雖然它取決於系統,但PHP通常使用IEEE 754雙精度格式,由於四捨五入的順序爲1.11e-16,因此會產生最大相對誤差。非基本的算術運算可能會導致更大的錯誤,當然,當多個運算複合時,必須考慮錯誤傳播。

此外,基數10中的浮點數(如0.1或0.7)可以精確表示的有理數作爲基數2中的浮點數沒有精確的表示,在內部使用該浮點數,無論大小尾數。因此,他們不能被轉換成其內部的二進制對應,而不會有小的精度損失。這可能導致令人困惑的結果:例如,樓層((0.1 + 0.7)* 10)通常會返回7而不是預期的8,因爲內部表示將類似於7.9999999999999991118 ....

+3

花車不是很好的錢 –

+0

@EdHeal如果錢只有兩個DP,它應該是...... – Adi219

+0

這也是小數點另一端的小數位數。 –

0

我會推薦在讀取和寫入DECIMAL值時使用字符串,以儘量減少在PHP中使用它們進行「簡單」算術的誘惑力。只要你將它們投入浮標並進行計算,就有可能失去精度。將這些計算留在數據庫本身中,並使用字符串進行輸入/輸出。

0

不要聽取推薦使用浮動金錢價值。這非常危險,因爲浮點數不能保證非整數值的準確比較。

好的解決方案是使用整數乘法器。 最好的解決方案是創建代表類型錢的ValueObject。