我在 MySQL 中有下表:create table testfloat (f float unsigned);insert into testfloat values (70.99);所以這應該將 32 位浮點數等效存儲70.99到表中。我有以下代碼從數據庫中讀取值:package mainimport ( "database/sql" "fmt" "strconv" _ "github.com/go-sql-driver/mysql")func main() { db, err := sql.Open("mysql", "root@(localhost)/test") if err != nil { panic(err) } rows, err := db.Query("select f from testfloat;") if err != nil { panic(err) } fmt.Printf("32-bit 70.99: %s\n", strconv.FormatFloat(70.99, 'f', 50, 32)) fmt.Printf("64-bit 70.99: %s\n", strconv.FormatFloat(70.99, 'f', 50, 64)) fmt.Printf("64-bit 70.99 cast from 32-bit 70.99: %s\n", strconv.FormatFloat(float64(float32(70.99)), 'f', 50, 64)) var f float64 for rows.Next() { if err := rows.Scan(&f); err != nil { panic(err) } fmt.Printf("DB 70.99: %.50f\n", f) }}輸出是:32-bit 70.99: 70.9899978637695312500000000000000000000000000000000064-bit 70.99: 70.9899999999999948840923025272786617279052734375000064-bit 70.99 cast from 32-bit 70.99: 70.98999786376953125000000000000000000000000000000000DB 70.99: 70.98999999999999488409230252727866172790527343750000如果 DB 將浮點數存儲為 32 位,則 DB 輸出應等于第三行。但它等于第二行。所以看起來它正在存儲一個 64 位浮點數,即使我指定float為類型。為什么會這樣?
1 回答

白板的微信
TA貢獻1883條經驗 獲得超3個贊
create table test (f float unsigned, d double unsigned); insert into test values (70.99, 70.99); SELECT f, d, f=d FROM test;
F | d | f=d |
---|---|---|
70.99 | 70.99 | 0 |
如您所見,float 和 double 列在視覺上存儲相同的值,但它們并不相等。
您在代碼中看到的效果是由 Go 產生的,而不是由 MySQL 產生的。MySQL 以文本格式(實際上是二進制流)而不是二進制數字返回輸出行集(及其中的數值),您可以使用嗅探器對此進行測試。
- 1 回答
- 0 關注
- 115 瀏覽
添加回答
舉報
0/150
提交
取消