Protobuf中double/float序列化是否固定大小?用其存经纬度选float可行吗?
Protobuf中double/float的大小特性及经纬度存储选型
一、double和float的序列化大小特性
- Protobuf 中的
double和float属于固定大小数值类型,无论存储的数值大小如何,序列化后占用的字节数固定:double始终占用8字节float始终占用4字节
这是因为它们严格遵循IEEE 754二进制浮点数标准进行序列化,不会像int32/int64这类类型采用可变长度编码。
二、用float存储经纬度是否合理?
判断合理性核心看业务的精度需求:
- 单精度
float表示经纬度时,绝对误差约为半米级(计算逻辑:float尾数共24位,相对精度约5.96e-8,对应纬度[-90,90]的绝对误差≈5.36e-6度,转换成距离约0.6米)。 - 若你的场景是普通地图标注、日常位置追踪(如外卖、打车),这个精度完全够用;但如果是高精度测绘、航空航天等对位置精度要求极高的场景,float的精度不足以满足需求,需选用
double(double的绝对误差约为2e-8米,可覆盖高精度场景)。 - 此外,
float比double节省一半字节,在海量位置数据存储或频繁传输的场景下,能有效降低存储和带宽开销。
综上:如果业务对位置精度要求在米级以内,选用float完全合理;高精度场景则建议用double。
内容的提问来源于stack exchange,提问作者losingsleeep
相关产品推荐
相关产品推荐

