2016-04-13 13 views
0

私はいくつかのフロートローカル変数を必要とするループのためのいくつか持っている:私はfloatにint型から私を変えるような価格と重量はローカル変数としてループのために埋め込むことにしたい浮動小数点数が整数値のみを含む場合、浮動小数点==を安全に比較することは保証できますか?

float price=0; 
float weight=0; 
int[] amountArray={2,5,3}; 
for(int i=0;i<=10;i++){ 
    int amount=0; 
    if(i<amountArray.length){ 
     amount=amountArray[i]; 
    } 
    //other codes for price and weight 
} 

int[] amountArray={2,5,3}; 
for(float i=0,price=0,weight=0;i<=10;i++){ 
    int amount=0; 
    if(i<amountArray.length){ 
     amount=amountArray[(int)i]; 
    } 
    //other codes for price and weight 
} 

変更されたバージョンは元のバージョンと同じですか?私はIEEE 754標準で正しく表現できる整数値しか含んでいないので、ハードウェア(特にアンドロイド)に依存しないので、浮動小数点を<、< =、==、intにキャストしてみてくださいこの場合の問題は、私は正しいですか?

+2

精度の問題は、整数または整数ではなく、整数がどれほど大きくなるかにも関係します。 –

+0

* "ローカル変数としてforループに価格と重量を埋め込んでおきたい" *このスタイルは実際には悪いです。コンパクトコードは、密でない場合にのみ有効です。ゴミを1行に絞るだけで、読みにくくなります。配列にアクセスするためにキャストする必要がある部分はひどいです。本当に、それを最初のやり方でやってください。 – Radiodef

+0

「価格」は、ドルではなくセントで計算することを検討してください。そうすれば、浮動小数点はまったくありません。次に、最終価格を印刷する前に "100で割り"することができます。 – selbie

答えて

2

これは、整数の大きさによって異なります。 floatは仮数23ビットを持ち、仮数の左側のビットは常に1とみなされます。つまり、値が24ビットに収まる正の整数を正確に表すことができます。しかし、整数がそれより大きい場合、十分なビットがありません。

はデモンストレーションのために、あなたは floatとして番号30000001を表現しようとすると、それが実際に明らかに ==値30000000を持つことになります高いことは整数で仕事に行くされていないことを示して http://www.adambeneschan.com/How-Does-Floating-Point-Work/showfloat.php?floatvalue=30000001&floattype=floatを、訪れてみてください。

+2

23個の小数点ビットが格納されていますが、通常の数には1個の暗黙ビットがあり、25個ではなく24個です。 –

+0

@PatriciaShanahan Aaargh、符号ビットを忘れました。訂正してくれてありがとう。 – ajb

関連する問題