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