私は現在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
とその行にキャストを避けるためにtemp1
でdollarNum
をスワップアウトしようとしたが、どちらも問題を修正
私は何も悪いことをフォーマットした場合
'decimal'は*も*正確な値が格納されていない、それはちょうどそれがdouble''より正確に格納できる値の異なるセットを持っている、と '.1'がその値であります'decimal'は正確に格納できますが、' double'は格納できません。 – Servy
正しいですが、内部的に小数点を使用するため、小数点以下の桁数(約28桁)が正確である限り、人間の金銭的価値(小数点で表現されます)を格納できます。これは金銭的価値を扱う際に(ほとんど)常にそうです。 –