2012-06-26 67 views
0

我有一个客户端程序通过tcp连接将数据发送到服务器。 在客户端,我需要发送一个标准化的十进制数服务器正常化我乘数十进制数10万,然后将其发送到服务器,但我得到了服务器错误的号码。例如, 。我怎样才能正常的一个双点数到一个int数字exacly?

double price; 

我把它归到74.40

cout<<price; ---> 74.40 

,当我串行我的对象我送

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

在wireshrk我看到客户端发送7439999.

为什么这发生过?我怎么能解决这个问题?

+3

见[这里](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)和[这里](http://floating-point-gui.de/) – sbi

+0

你应该看看[这个](http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems) –

+0

@sbi,你应该看看[为什么你的链接不应该说点击这里](http:// uxmovement。 COM /内容/为什么 - 你的链接 - 宜 - 永不言点击这里/)。 –

回答

1

不要将任何内容存储为浮点值。改为使用有理数,或使用固定点值。浮点值(如double)基本上是“欺骗”,以解决大范围的可能值到内存的合理大块,他们不得不做出妥协才能做到这一点。

如果要存储一个财务价值,考虑将便士或美分,或无论是最小的面额。

+0

谢谢,但我应该如何建立一个新的对象? –

+0

@herzlshemuelian:这是一个有点外一个简单的答案的范围,但互联网确实有很多的建议。有两个SO问题提供了一些有用的链接,[“定点数学的最佳方法”](http://stackoverflow.com/questions/79677/whats-the-best-way-to-do-fixed-点数学)和[“C定点库”](http://stackoverflow.com/questions/2945747/c-fixed-point-library)这可能会指出你在一个有用的方向。但实际上应该代表什么价值? – Rook

+0

我需要乘法器之类的数学函数,并从字符串中进行扫描并以字符串或正常化数字(int)形式打印到流中。 –

0

这是由于浮点精度误差。你可以添加一些圆角:

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

你需要数字的舍入,你将其转换为整数时,由于无法浮点准确地表示十进制数。

int tmp = price*Normal + 0.5; 
相关问题