float を int にキャストしようとしていますが、何かが欠けています
float submittedAmount = 0.51f;
int amount = (int)(submittedAmount * 100);
なぜ答えは50なのですか?
float を int にキャストしようとしていますが、何かが欠けています
float submittedAmount = 0.51f;
int amount = (int)(submittedAmount * 100);
なぜ答えは50なのですか?
浮動小数点の算術演算のため、乗算された値は正確には51ではありません。今試してみると、* 0.51f *100*の結果は50.9999990463257でした。
そして、50.9999990463257 toとintを解析すると、確実に50になります。
このような計算を正確にしたい場合は、のdecimal
代わりにのようなタイプを使用する必要がありfloat
ます。
その理由を理解したい場合は、以下にリンクしている記事を読んでください。
で試してみてください
int amount = (int)(submittedAmount * 100.0);
あなたが書くとき0.51f
は正確ではありません0.51
と呼ばれるこの素晴らしい記事を読むWhat Every Computer Scientist Should Know About Floating-Point Arithmetic
Convert クラスを使用します。それ以外の場合、答えは 50 のままです。
var amount = Convert.ToInt32(submittedAmount * 100.0));
0.51f
は実際に0.509999999999
。浮動小数点は不正確だからです。
追加したいのですがfloat
、金銭の計算には使用しないでください。decimal
代わりに使用してください。