我有一个通过tcp连接的客户端程序,将数据发送到服务器。在客户端,我需要将一个标准化的十进制数发送到服务器进行标准化,我将十进制数乘以100,000,然后将其发送到服务器,但我在服务器中得到了错误的数字。例如。
double price;我把它从Gui设置为74.40
cout<<price; ---> 74.40当我序列化我的对象时,我发送
#define Normal 100000
int tmp = price*Normal;
oDest<<tmp;在wireshrk中,我看到客户端发送了7439999。
为什么会发生这种情况?我怎样才能避免这个问题?
发布于 2012-06-26 23:35:30
不要将任何内容存储为浮点值。请改用有理数,或使用固定点值。浮点值(如double)基本上是“作弊”的,以便将大范围的可能值固定到合理的内存块中,并且它们必须为此做出妥协。
如果你在存储金融价值,考虑存储便士或美分或任何最小面额的东西。
发布于 2012-06-26 23:35:05
这是由于浮点精度错误造成的。您可以添加一些舍入:
int tmp = (price + 0.5/Normal)*Normal;发布于 2012-06-26 23:35:18
由于浮点数不能精确表示十进制数,因此您需要在将数字转换为整数时对其进行舍入。
int tmp = price*Normal + 0.5;https://stackoverflow.com/questions/11210757
复制相似问题