2014-10-09 19 views
0

我設置了一些表的列類型爲float,長度爲53,設置它的值爲38.8, 當我使用sqlsrv驅動程序進行查詢時,沒關係,它的顯示值是38.8。 但是,當我使用pdo_sqlsrv驅動程序的查詢,它的顯示值是38.799999999999997, 這是爲什麼?當轉換爲二進制pdo_sqlsrv驅動程序如何將float類型轉換爲字符串?

+2

所有浮點數(在數據庫或代碼中)不存儲精確的十進制值。看到我之前寫的這個答案 - 同樣的事情適用。 http://stackoverflow.com/a/12291065/1450077 – Fluffeh 2014-10-09 08:14:39

回答

0

十進制數38.8是periodic

100110.1100110011001100110011001100110011001100110011001100110011001100110 
     ^^^^ 
     Repeats forever 

因此,不能準確地存儲在一個計算機如果選擇一個常規的數字格式(其總是具有固定的存儲大小)。

它並不真正的問題:

ini_set('precision', 30); 
var_dump(38.8, number_format(38.8, 8)); 
float(38.7999999999999971578290569596) 
string(11) "38.80000000" 

但是,如果8 :因爲你建立你只需要8位小數,你應該放棄休息時得到正確的值十進制對你來說很重要,你應該將列類型切換爲DECIMAL,它將內部數字存儲爲字符串,從而保持精確的十進制表示形式。

相關問題