如何使用Google Protobuf通过网络发送浮点数?

gar*_*721 6 protocol-buffers

我有一个原始文件,其中包含以下消息:

message MapInfo
{
    required float version = 1;
    required bool status = 2;
}
Run Code Online (Sandbox Code Playgroud)

其中,version是一个浮点值。当我从C ++向Python发送float值2.1时,在python端,它反序列化为2.09999990463。

为什么会这样呢?浮点数是否有特殊处理?

Protoc编译器版本和运行时protobuf库版本为2.4.1。

jpa*_*jpa 7

值 2.1 无法精确表示为浮点数。您可以在简单的 C++ 程序或 C++ 调试器中对此进行测试:

(gdb) print 2.1f
$1 = 2.0999999
Run Code Online (Sandbox Code Playgroud)

然而,Python 将所有内容都呈现为双精度。因此,从 C++ 接收到的浮点值会转换为最接近 2.0999999 的双精度值...,而不是最接近 2.1。

这只是以下事实的结果:并非所有十进制数都可以完全表示为浮点数。一般来说,浮点数总是有舍入误差,你不能指望它们是完全正确的值,只是非常接近。

  • 您可能应该将版本号存储为字符串而不是浮点数,是的。 (4认同)