我在 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 关注
- 141 浏览
添加回答
举报
0/150
提交
取消
