1

我们有一个TCP/IP 套接字软件,包括一个Java 客户端C++ 服务器。跨套接字的数据包含数字、int、floatchar 数组。这些浮点数的精度是该点之后的四位数字。最近,由于精度原因,我们开始使用char 数组来表示数据结构/协议中的浮点数或int来表示浮点数(float to int by time 10000,然后在接收端除以 10000)。

有人告诉我,如果我们直接在数据结构/协议中使用浮点数,很难保持精度。发送方很难准确地将浮点数放入套接字中,接收方很难接收/转换回准确的浮点数。

我不相信。通过再次阅读维基。似乎单精度浮点数可以提供 6-9 精度:

这给出了 6 到 9 位有效小数位的精度(如果将具有最多 6 个有效小数位的十进制字符串转换为 IEEE 754 单精度,然后转换回相同的有效小数位数,则最终字符串应与原始字符串匹配;和如果将 IEEE 754 单精度转换为具有至少 9 位有效小数的十进制字符串,然后再转换回单精度,则最终数字必须与原始数字匹配 [3])。

如果所需的精度是 4 或 6,那么通过 Internet 传输浮点数的良好做法是什么?还有更多呢?双倍的!?。银行如何处理更大的浮点数?

4

2 回答 2

1

你看过谷歌协议缓冲区吗?https://code.google.com/p/protobuf/

基本上,您将使用 protobuf 将浮点数序列化为字符串,通过网络发送字符串,然后在另一端使用 protobuf 将其转回浮点数。当您使用它时,您可以使用 protobuf 将消息的其余部分作为字符串发送,以在您发送的数据中强制执行某些结构/一致性。

此外,编码消息与语言无关,因此任何具有协议缓冲区库的语言(google 提供 c++、python 和 java 实现,并且有无数其他语言的第三方实现)都可以读取/解析/使用该消息。

于 2013-05-21T16:38:20.987 回答
1

这些浮点数的精度是该点之后的四位数字。

不,不是。您的浮点数根本没有“[decimal] 点之后的四个 [decimal] 数字”。它们有未知数量的二进制数字,这是您无法控制的。你所有的乘法和除以 10000 不会也不能改变它,因为小数位和二进制位是不可通约的。如果你想要一个固定的十进制精度,你必须使用十进制基数。

最近,由于精度原因,我们开始使用 char 数组来表示数据结构/协议中的浮点数或 int 来表示浮点数(float to int by time 10000,然后在接收端除以 10000)。

完全浪费你的时间。看上面。另请参阅此处以获取证据。

有人告诉我,如果我们直接在数据结构/协议中使用浮点数,很难保持精度。发送方很难准确地将浮点数放入套接字中,接收方很难接收/转换回准确的浮点数。

你被误导了。您可以使用 DataOutputStream 和 DataInoutStream 的 API 将浮点数直接放到二进制文件中,格式化和恢复它。但是,您根本不应该使用浮点数。

如果所需的精度是 4 或 6,那么通过 Internet 传输浮点数的良好做法是什么?

这个问题体现了用词的矛盾。

银行如何处理更大的浮点数?

他们不使用它们。

于 2013-05-21T21:03:44.277 回答