我们有一个TCP/IP套接字软件,包括一个、Java客户端、和C++服务器。整个套接字的数据包含数字、int、float和char数组。这些浮标的精度为点后的四位数。最近,我们开始使用char数组来表示数据结构/协议中的浮点数,或者使用 int 来表示浮点数(浮点数乘以时间10000,然后在接收端除以10000 )。
有人告诉我,如果直接在数据结构/协议中使用浮点数,就很难保持精度。发送方很难准确地将浮点数放入套接字中,而接收方很难接收/转换回确切的浮动号。
我不相信。再读一遍维基。单精度浮标似乎可以提供6-9精度:
这给出了6到9个有效十进制数字的精度(如果一个小数点最多为6个的十进制字符串被转换为IEEE 754单个精度,然后转换回相同的有效小数数,那么最后的字符串应该与原始数字匹配;如果IEEE 754单个精度被转换为至少9个有效小数的十进制字符串,然后转换回单个,那么最后的数字必须与原来的3匹配)。
如果所需的精度为4或6,那么在互联网上传输浮标的良好做法是什么?不止这些怎么样?加倍!?银行如何处理更大的浮点数?
发布于 2013-05-21 21:03:44
这些浮标的精度是点之后的四位数。
不,不是。你的浮点数根本没有小数点后的四个小数位数。它们的二进制数未知,您无法控制。你所有的乘积和除以10000不会也不能改变这一点,因为小数位和二进制位是不可通约的。如果您想要一个固定的十进制精度,您必须使用十进制基数。
最近,由于精度的原因,我们开始使用char数组来表示数据结构/协议中的浮点数,或者使用int表示浮点数(浮点数为int,时间为10000,然后在接收端除以10000 )。
完全是浪费你的时间。请参见上面的。如需证明,请参见这里。
有人告诉我,如果直接在数据结构/协议中使用浮点数,就很难保持精度。发送方很难准确地将浮点数放入套接字中,而接收方很难接收/转换回确切的浮动号。
你被误导了。您可以使用DataOutputStream和DataInoutStream的API将浮点以二进制格式直接放置到导线上,并进行相同的恢复。然而,你根本不应该使用浮点。
如果所需的精度为4或6,那么在互联网上传输浮标的良好做法是什么?
这个问题在术语上是矛盾的。
银行如何处理更大的浮点数?
他们不使用它们。
发布于 2013-05-21 16:38:20
你看过google协议缓冲区吗?https://code.google.com/p/protobuf/
基本上,您将使用protobuf将浮点序列化为字符串,通过网络发送字符串,并在另一侧使用protobuf将其转换为浮点数。当您使用它时,您还可以将消息的其余部分以字符串的形式发送,并带有protobuf,以在您发送的数据中强制执行某种结构/一致性。
此外,编码的消息与语言无关,所以任何有协议缓冲库的语言(google提供c++、python和java实现,还有无数其他语言的第三方实现)都可以读取/解析/使用该消息。
https://stackoverflow.com/questions/16674664
复制相似问题