我在 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为类型。为什么会这样?
森栏
白板的微信
随时随地看视频慕课网APP
相关分类