2017-09-07 8 views
-3

私は現在The Big List of Projectsに変更返却プログラムを書いていますが、私のコードでは論理エラーが発生しました。問題のスニペットは次のとおりです。キャスティングでは分の不一致が発生する可能性がありますか?

if(change/1 >= 1) // checks if when divided the value is higher than 1, signaling that there is at least a dollar in change 
{ 
    double temp1 = change % 1; // declared as double for casting 
    temp1 = change - temp1; // and used to remove excess, non-dollar value 
    dollarNum = (int) temp1; 
    change -= (double)dollarNum; 
} 

ここで変更は10.01という値になります。しかし、このスニペットが実行された後、値は0.01でなく0.00999999999999979になります。私は何かがここで鋳造に間違っていると仮定していますか?それとも全く別のものなのでしょうか?

また、私が「変更=変更最後の行を再フォーマットしようとしたことに注意してください - 。dollarNumとその行にキャストを避けるためにtemp1dollarNumをスワップアウトしようとしたが、どちらも問題を修正

私は何も悪いことをフォーマットした場合

答えて

2

値が正確に格納されないため、doubleはこの種の計算には適していません(内部的には10進数ではなく2進数を使用します) 。

'小数点'型を使用する代わりに(https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/decimal):

 decimal change = 10.1M; 
     if(change/1 >= 1) //checks if when divided the value is higher than 1, signalling that there is at least a dollar in change 
     { 
      decimal temp1 = change % 1; //declared as double for casting 
      temp1 = change - temp1; //and used to remove excess, non-dollar value 
      int dollarNum = (int)temp1; 
      change -= (decimal)dollarNum; 
     } 
+0

'decimal'は*も*正確な値が格納されていない、それはちょうどそれがdouble''より正確に格納できる値の異なるセットを持っている、と '.1'がその値であります'decimal'は正確に格納できますが、' double'は格納できません。 – Servy

+0

正しいですが、内部的に小数点を使用するため、小数点以下の桁数(約28桁)が正確である限り、人間の金銭的価値(小数点で表現されます)を格納できます。これは金銭的価値を扱う際に(ほとんど)常にそうです。 –

関連する問題