我如何正确地将双点数正常化为int数?

时间:2012-06-26 15:30:04

标签: c++

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

double price;

我把它从Gui设置为74.40

cout<<price; ---> 74.40

当我串行我的对象时,我发送

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

int tmp = (price + 0.5/Normal)*Normal;

答案 2 :(得分:0)

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

int tmp = price*Normal + 0.5;