0
我設置了一些表的列類型爲float,長度爲53,設置它的值爲38.8, 當我使用sqlsrv驅動程序進行查詢時,沒關係,它的顯示值是38.8。 但是,當我使用pdo_sqlsrv驅動程序的查詢,它的顯示值是38.799999999999997, 這是爲什麼?當轉換爲二進制pdo_sqlsrv驅動程序如何將float類型轉換爲字符串?
我設置了一些表的列類型爲float,長度爲53,設置它的值爲38.8, 當我使用sqlsrv驅動程序進行查詢時,沒關係,它的顯示值是38.8。 但是,當我使用pdo_sqlsrv驅動程序的查詢,它的顯示值是38.799999999999997, 這是爲什麼?當轉換爲二進制pdo_sqlsrv驅動程序如何將float類型轉換爲字符串?
十進制數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
,它將內部數字存儲爲字符串,從而保持精確的十進制表示形式。
所有浮點數(在數據庫或代碼中)不存儲精確的十進制值。看到我之前寫的這個答案 - 同樣的事情適用。 http://stackoverflow.com/a/12291065/1450077 – Fluffeh 2014-10-09 08:14:39