0

サーバーにデータを送信するtcp接続によるクライアントプログラムがあります。クライアントでは、正規化のために正規化された10進数をサーバーに送信する必要があります。10進数を100,000に乗算してからサーバーに送信しますが、サーバーで間違った数値を取得します。例えば。

double price;

GUIから74.40に設定しました

cout<<price; ---> 74.40

オブジェクトをシリアル化すると、送信します

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

wirehrkでは、クライアントが7439999を送信したことがわかります。

なぜこれが起こったのですか?どうすればこの問題を回避できますか?

4

3 に答える 3

1

浮動小数点値として何も格納しないでください。代わりに有理数を使用するか、固定小数点値を使用してください。浮動小数点値(のようなdouble)は、基本的に、可能な値の広い範囲を適切なメモリのチャンクに固定するために「チート」し、そうするために妥協する必要があります。

金銭的価値を保存する場合は、ペニーやセントなど、最小の金額を保存することを検討してください。

于 2012-06-26T15:35:29.560 に答える
0

これは、浮動小数点の精度エラーが原因です。丸めを追加できます。

int tmp = (price + 0.5/Normal)*Normal;
于 2012-06-26T15:35:05.323 に答える
0

浮動小数点が10進数を正確に表すことができないため、整数に変換するときに数値を丸める必要があります。

int tmp = price*Normal + 0.5;
于 2012-06-26T15:35:18.113 に答える