5

float を int にキャストしようとしていますが、何かが欠けています

float submittedAmount = 0.51f;

int amount = (int)(submittedAmount * 100);

ここに時計があります。 変数値を見てください

なぜ答えは50なのですか?

4

4 に答える 4

5

浮動小数点の算術演算のため、乗算された値は正確には51ではありません。今試してみると、* 0.51f *100*の結果は50.9999990463257でした。

そして、50.9999990463257 toとintを解析すると、確実に50になります。

このような計算を正確にしたい場合は、のdecimal代わりにのようなタイプを使用する必要がありfloatます。

その理由を理解したい場合は、以下にリンクしている記事を読んでください。

すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと

于 2013-02-11T09:58:19.093 に答える
1

で試してみてください

int amount = (int)(submittedAmount * 100.0);

あなたが書くとき0.51fは正確ではありません0.51

と呼ばれるこの素晴らしい記事を読むWhat Every Computer Scientist Should Know About Floating-Point Arithmetic

于 2013-02-11T09:58:13.023 に答える
0

Convert クラスを使用します。それ以外の場合、答えは 50 のままです。

 var amount  = Convert.ToInt32(submittedAmount * 100.0));
于 2013-02-11T10:00:50.360 に答える
0

0.51fは実際に0.509999999999。浮動小数点は不正確だからです。

追加したいのですがfloat、金銭の計算には使用しないでください。decimal代わりに使用してください。

于 2013-02-11T10:01:44.760 に答える