2
有誰知道爲什麼floor(61681) = 61681
,但是floor(616.81*100) = 61680
?PHP樓層功能
我已經嘗試了許多其他值一樣
floor(716.81*100) = 71681
floor(816.81*100) = 81681
floor(916.81*100) = 91681
floor(616.83*100) = 61683
任何人都知道爲什麼會這樣?
有誰知道爲什麼floor(61681) = 61681
,但是floor(616.81*100) = 61680
?PHP樓層功能
我已經嘗試了許多其他值一樣
floor(716.81*100) = 71681
floor(816.81*100) = 81681
floor(916.81*100) = 91681
floor(616.83*100) = 61683
任何人都知道爲什麼會這樣?
由於二進制浮點數的性質,會發生內部舍入誤差。沒有辦法將616.81
精確地表示爲二進制浮點數 - 其最接近的近似值實際上略小於616.81
。但是,61681
可以完全表示。
當616.81
表示由100
相乘,結果比61681
少一點點,因此要求它floor
將返回61680
。
如果你要絕對精確,你可以使用PHP的BC數學函數,它可以爲你需要的性能爲代價的精確。例如:
var_dump(floor(bcmul(616.18, 100, 12)));
請仔細閱讀我的回答。二進制浮點數的本質固有的內部舍入不準確性。這意味着不可能精確地表示一些數字,例如'616.81'。另外,由於codepad.org在真正的PHP解釋器上運行代碼,我用它作爲證明。請解除您的失望,因爲我的回答是正確的。 –
那麼爲什麼我的PHP顯示61681? http://sandbox.phpcode.eu/g/bb5f9.php – genesis
因爲打印浮點數字的例程不打印確切的內部表示,而是顯示一個四捨五入的數字以顯示您可能期望的內容。我建議你閱讀http://floating-point-gui.de/ –