亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

MySQL `FLOAT` 實際上存儲 `DOUBLE`?

MySQL `FLOAT` 實際上存儲 `DOUBLE`?

Go
森欄 2023-03-15 14:24:30
我在 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;
Fdf=d
70.9970.990

小提琴

如您所見,float 和 double 列在視覺上存儲相同的值,但它們并不相等。

您在代碼中看到的效果是由 Go 產生的,而不是由 MySQL 產生的。MySQL 以文本格式(實際上是二進制流)而不是二進制數字返回輸出行集(及其中的數值),您可以使用嗅探器對此進行測試。


查看完整回答
反對 回復 2023-03-15
  • 1 回答
  • 0 關注
  • 115 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號