我们有一个 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,那么在互联网上传输浮动的好习惯是什么?不仅如此呢?双!?。银行如何处理更大的浮点数?
答案 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,那么在互联网上传输浮动的好习惯是什么?
这个问题体现了矛盾。
银行如何处理更大的浮点数?
他们不使用它们。