2012-06-26 72 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; 
相關問題