iPhone / Obj C:なぜfloatをint:(int)float * 100に変換できないのですか?

floating-point int iphone objective-c
iPhone / Obj C:なぜfloatをint:(int)float * 100に変換できないのですか?

私のコードでは、浮動小数点を使用して通貨の計算を行っていますが、丸めにより望ましくない結果が生じているため、すべてをintに変換しようとしています。 インフラストラクチャをできるだけ変更せずに、init関数でこれを行いました。

-(id)initWithPrice:(float)p;
{
[self setPrice:(int)(p*100)];
}

メインセクションで100 b / cを掛けます。値は、.xxから2桁の小数で示されます。 異常に気づくのは、フロート1.18の場合、intが117に丸めることです。 それを知っている人はいますか? フロートは1.18のままにします。 セント単位のintで118になると予想しています。

ありがとう。

  1  0


ベストアンサー

浮動小数点は常に少し不正確です。 IEEE浮動小数点エンコードでは、2のべき乗を正確に表現できます(4,2,1,0.5,0.25,0.125,0.0625、…​など)が、0.1のような数値は常に近似値です(合計として表現してみてください) 2のべき乗の。

(int)キャストは、入ってくるものをすべて切り捨てます。したがって、この不正確さのためにp * 100が117.9999995に解決される場合、1.18ではなく1.17になります。

より良い解決策は、p * 100でroundfのようなものを使用することです。 さらに良いのは、アップストリームに進み、プログラム全体で整数を使用して固定小数点演算に完全に変換できる場合です。

4


タイトルとURLをコピーしました