在Protobuf中,双精度或浮点类型在序列化时大小是固定的吗?

问题描述 投票:0回答:1

Protobuf 中的“double”和“float”数据类型是否固定大小?序列化时,无论它们实际保留什么值(大或小),它们是否占用固定数量的字节(例如 8 或 4 个字节)?我想用其中之一来保留纬度经度。如果它们是固定的,那么我认为使用“float”是有意义的,因为它似乎已经足够了?

java geometry protocol-buffers protobuf-java
1个回答
0
投票

根据Google protobuf编码文档

double
将固定为8字节,
float
在序列化时固定为4字节

非varint数字类型很简单——double和fixed64具有连线类型I64,它告诉解析器期望固定的八字节数据块。我们可以通过写5:25.4来指定双记录,或者用6:200i64来指定fixed64记录。在这两种情况下,省略显式电线类型意味着 I64 电线类型。

类似地,float 和fixed32 具有线类型I32,这告诉它需要四个字节。这些的语法包括添加 i32 前缀。 25.4i32 将发出四个字节,200i32 也将发出四个字节。标签类型被推断为 I32。 浮动取决于您对精度的具体需求:

在表示纬度和经度时,您在

double
float
之间的选择取决于您对精度的具体需求:

  • 浮点数提供大约 6-9 位小数位的精度。在纬度和经度的背景下,这将允许您指定大约一米以内的位置。

  • 另一方面,双精度数提供大约 15-17 位小数位的精度。这种精度水平通常超出了地理定位数据所需的精度。

综上所述,如果您不需要极高的精度,那么 float 应该足以存储经纬度坐标。使用 float 而不是 double 还可以节省一些空间,特别是如果您有大量此类坐标数据集需要存储或传输。

我希望这有助于澄清您的问题!

© www.soinside.com 2019 - 2024. All rights reserved.