为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号