MySQL `FLOAT` 实际上存储 `DOUBLE`?

我在 MySQL 中有下表:


create table testfloat (f float unsigned);

insert into testfloat values (70.99);

所以这应该将 32 位浮点数等效存储70.99到表中。


我有以下代码从数据库中读取值:


package main


import (

    "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.98999786376953125000000000000000000000000000000000

64-bit 70.99: 70.98999999999999488409230252727866172790527343750000

64-bit 70.99 cast from 32-bit 70.99: 70.98999786376953125000000000000000000000000000000000

DB 70.99: 70.98999999999999488409230252727866172790527343750000

如果 DB 将浮点数存储为 32 位,则 DB 输出应等于第三行。但它等于第二行。所以看起来它正在存储一个 64 位浮点数,即使我指定float为类型。为什么会这样?


森栏
浏览 142回答 1
1回答

白板的微信

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=d70.9970.990小提琴如您所见,float 和 double 列在视觉上存储相同的值,但它们并不相等。您在代码中看到的效果是由 Go 产生的,而不是由 MySQL 产生的。MySQL 以文本格式(实际上是二进制流)而不是二进制数字返回输出行集(及其中的数值),您可以使用嗅探器对此进行测试。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go