我有一个通过tcp连接的客户端程序,它将数据发送到服务器。 在客户端我需要发送一个规范化的十进制数到服务器进行规范化I乘数十进制数到100,000,然后发送到服务器,但我在服务器中得到错误的数字。 例如。
double price;
我把它从Gui设置为74.40
cout<<price; ---> 74.40
当我串行我的对象时,我发送
#define Normal 100000
int tmp = price*Normal;
oDest<<tmp;
在wireshrk中,我看到客户端发送了7439999。
为什么会这样?我怎么能解决这个问题?
答案 0 :(得分:1)
不要将任何内容存储为浮点值。请改用有理数,或使用固定点值。浮点值(如double
)基本上是“作弊”,以便将大量可能的值固定到合理的内存块中,并且为了这样做,他们必须做出妥协。
如果您要存储财务价值,请考虑存储便士或美分或任何最小面额。
答案 1 :(得分:0)
这是由于浮点精度错误造成的。您可以添加一些舍入:
int tmp = (price + 0.5/Normal)*Normal;
答案 2 :(得分:0)
由于浮点无法准确表示十进制数,因此在将数字转换为整数时需要对数字进行舍入。
int tmp = price*Normal + 0.5;