0

我有一个通过 tcp 连接将数据发送到服务器的客户端程序。在客户端,我需要向服务器发送一个规范化的十进制数以进行规范化我将十进制乘数乘以 100,000,然后将其发送到服务器,但我在服务器中得到错误的数字。例如。

double price;

我将它从 Gui 设置为 74.40

cout<<price; ---> 74.40

当我序列化我的对象时,我发送

#define Normal 100000
int tmp = price*Normal;
oDest<<tmp;

在wireshrk中,我看到客户端发送了7439999。

为什么会这样?我怎样才能解决这个问题?

4

3 回答 3

1

不要将任何内容存储为浮点值。请改用有理数,或使用定点值。浮点值(如double)基本上是“作弊”,以便将大量可能的值固定到合理的内存块中,他们必须做出妥协才能做到这一点。

如果您要存储财务价值,请考虑存储便士或美分或任何最小面额的东西。

于 2012-06-26T15:35:29.560 回答
0

这是由于浮点精度错误。您可以添加一些舍入:

int tmp = (price + 0.5/Normal)*Normal;
于 2012-06-26T15:35:05.323 回答
0

由于浮点无法准确表示十进制数,因此您需要在将其转换为整数时对其进行四舍五入。

int tmp = price*Normal + 0.5;
于 2012-06-26T15:35:18.113 回答