0

どうしたの?!0.1〜0.1になるまで、減算は正常に機能します。私はnonoba.comAPIを使用してビジュアルC#2008を使用しています。

Console.WriteLine("hit! " + Users[targetNum].character.health + " : " + player.character.profile.attackPower);

Users[targetNum].character.health -= player.character.profile.attackPower;

Console.WriteLine("health! " + Users[targetNum].character.health);

出力:

hit! 0.1 : 0.1
health! 1.490116E-08

ありがとうございました-私は通常、素敵な「丸い」数値を加算/減算しているので、10進数タイプを使用する可能性があります。今のところ、私はただ行きます:

if (Users[targetNum].character.health <= 0.00001)

ちなみに、これは実際にはc#の「バグ」ではないことはわかっていました。コードのバグか、理解の欠如のいずれかが原因だと思いました。

推奨されるすべての読み方を読んだ後、私の愚かさは通常、2進数ではなく10進数の浮動小数点を持つActionScript Number型を使用したためであると結論付けます。とにかく、この出力は得られません。

4

5 に答える 5

17

これは浮動小数点演算ではかなり正常に思えます...知覚できない丸めの違いを説明するために、常に小さなデルタをチェックする必要があります。シナリオによっては、decimalあなたが望むものかもしれません。

基本的に、両方の場合でまったく同じ0.1であることが確実でない限り(つまり、何も行われていない場合)、ゼロになる可能性は低くなります。一般に、ほぼゼロの値が得られます。通常、直感的に期待するものをより多く得ることdecimalができます。

こちらのJonSkeetのページも参照してください。

于 2009-01-25T23:02:53.560 に答える
12

あなたは明らかに「すべてのコンピュータ科学者が浮動小数点数について知っておくべきこと」を読む必要があります。

このような状況でバグを見つけたと考える代わりに、私は通常、私の仮定の1つを最初にチェックする必要があると思います。

于 2009-01-25T23:11:14.040 に答える
1

常に "ナイス ラウンド" の数値、つまり 10 分の 1 または 100 分の 1 を足したり引いたりしている場合は、10 分の 1 単位の整数でヒットとヘルスの値を追跡できます。アナロジーは、浮動小数点ドルではなく、整数セントでお金を追跡する金融プログラムです。整数を使用すると、浮動小数点演算の問題がすべて回避されます。

于 2009-01-25T23:48:51.220 に答える
0

cos(x) != cos(y)少しオフトピックですが、次の場合でも、なぜ真実である可能性があるのか​​を説明する興味深い読み物がありますx == y

http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.18

于 2009-11-08T13:19:57.447 に答える
0

浮動小数点演算は、どの言語でも常に近似値です。これがCPUの動作方法だからです。答えの絶対的な精度を気にする場合(たとえば、お金を扱っているため)、浮動小数点を使用しないでください。

于 2009-01-25T23:12:44.960 に答える