Go中浮点类型仅有float32和float64,无默认类型,声明必须显式指定;字面量3.14为无类型常量,赋值需匹配类型或显式转换,短变量声明自动推导为float64。

Go里浮点类型只有 float32 和 float64 两种
Go不支持 float、double 这类C风格的简写,也没有默认浮点类型。声明时必须明确指定是 float32 还是 float64,否则编译报错。
常见错误现象:cannot use 3.14 as float32 value in assignment 或类型推导失败——这是因为字面量 3.14 默认是未定类型的数字常量,不能直接赋给未显式声明类型的变量。
- 用短变量声明
:=时,Go会根据字面量自动推导为float64(例如x := 3.14→x是float64) - 但若你写
var y float32 = 3.14,会报错:常量3.14精度超出float32表示范围,需显式转换或加后缀:var y float32 = 3.14e0或var y = float32(3.14) -
float64是更常用的选择,精度高、性能在多数场景无明显劣势;float32仅在内存敏感(如GPU计算、大量数组)或协议要求(如Protobuf的float字段)时使用
声明方式:显式类型 vs 类型推导
两种写法都合法,但语义和适用场景不同:
-
var pi float64 = 3.1415926—— 显式声明,类型确定,适合需要强调精度或文档意图的场景 -
pi := 3.1415926—— 短声明,Go 推导为float64;但如果后续想赋float32值(如pi = float32(2.71)),会编译失败:类型不匹配 -
var temperature float32(未初始化)→ 初始值是0(不是0.0,但效果等价),类型锁定为float32
字面量后缀不是语法,而是隐式类型提示
Go没有像C++那样的 f 后缀(如 3.14f)。但你可以用科学计数法或类型转换来“引导”推导:
立即学习“go语言免费学习笔记(深入)”;
-
a := 1.23e-2→float64(指数形式仍推导为float64) -
b := float32(1.23)→ 明确转成float32,变量b类型即为float32 - 不要写
c := 1.23f—— 这是语法错误,f不被识别 - 注意:浮点字面量本身无类型,只有参与上下文(如赋值、函数参数)时才绑定具体类型
和 JSON、数据库交互时容易忽略精度问题
Go 的 json.Unmarshal 默认把 JSON 数字解析为 float64,哪怕原始值是整数或小数位很少。如果结构体字段声明为 float32,反序列化会失败或截断精度。
- 例如:
type Config struct { TimeoutSec float32 },JSON 中"timeout_sec": 30可能被解析为30.0(float64),赋值给float32字段时虽能隐式转换,但存在舍入风险(尤其大数值) - 更稳妥的做法:统一用
float64接收,或自定义UnmarshalJSON方法做校验与转换 - 数据库驱动(如
database/sql)读取REAL或FLOAT列时也默认返回float64,同理需留意目标变量类型是否匹配
float32 或 float64,一个字母都不能省。


















