通过套接字传输到网络

时间:2013-05-21 16:11:54

标签: java c++ networking floating-point network-programming

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

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

我不相信。再次阅读Wiki。看起来单精度浮点数可以提供6-9的精度:

  

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

如果要求的精度是4或6,那么在互联网上传输浮动的好习惯是什么?不仅如此呢?双!?。银行如何处理更大的浮点数?

2 个答案:

答案 0 :(得分:1)

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

基本上,您可以使用protobuf将浮点数序列化为字符串,通过网络发送字符串,并使用另一侧的protobuf将其转换回浮点数。当你在它时,你可以将其余的消息作为带有protobuf的字符串发送,以强制你发送的数据中的一些结构/一致性。

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

答案 1 :(得分:1)

  

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

不,不是。您的浮点数在[十进制]点后面没有'四[十进制]数字。它们具有未知数量的二进制数字,您无法控制。所有乘法和除以10000都不会也不能改变它,因为小数位和二进制位是不可通约的。如果需要固定的小数精度,则必须使用十进制基数。

  

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

完全浪费你的时间。往上看。另请参阅here以获取证明。

  

如果我们直接在数据结构/协议中使用float,我被告知很难保持精度。发送方很难完全浮入套接字,接收方很难接收/转换回确切的浮点数。

你被误导了。您可以使用DataOutputStream和DataInoutStream的API将float以二进制格式直接放到线上,并以相同的方式恢复它。但是你根本不应该使用浮点数。

  

如果要求的精度是4或6,那么在互联网上传输浮动的好习惯是什么?

这个问题体现了矛盾。

  

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

他们不使用它们。