2011-02-02 28 views
5

私は秒単位の時間間隔であるdoubleを持っています。有効な値は0.0,0.5,1.0,1.5などです。このdoubleをintに安全に変換する方法は?

この値をintに変換する必要があります。しかし、私はこれを行うことはできません。何が起こることがある

int converted = (int)theDouble; 

ので、私のダブルそのため、浮動小数点エラーのために0.999999999いうより1.000000000です。それはちょうど尾をカットし、私たちは1の代わりに0で終わるだろう。また、私の倍精度浮動小数点が0.9のとき、私は1のintが欲しい。1.1のとき、intを1にしたい。それは1.8です。intを2にします。

round()関数はありますが、Xcodeはこれに関するドキュメントを表示していません。ヘッダーは、それがダブルを返すことだけを伝えます。それで私は必要なものではありません。

その倍精度浮動小数点型の近似表現を取得する最も安全な方法は何ですか?二重ではあるが、私は決して0.5または1つの断片的な数字より高い精度を必要としない(私は数学の天才ではなく、正確な科学用語を知らない)。 math.h

int converted = (int)(round(theDouble)); 

答えて

2

あり、 theDoubleを丸めることができますが、正確な精度のために浮動小数点数を決して考慮しないでください。代わりに、平等のための整数でtheDoubleを比較しようとしているのは、このような何かを行う必要があります。

if (abs(theDouble - theInteger) <= 0.000001) 
    doSomething(); 

theIntegerは、比較の前に、二重にキャストされようとしているので、どちらか正確ではないかもしれません、覚えておいてください。呼び出し

最後に一つ、:あなたが言ったように、浮動小数点エラーが値をダウンさせる可能性がある、ので

int converted = (int) round(theDouble) 

は、やや危険です。値が0、0.5、1.0、1.5、...の場合は、このようなことはしないでください。

int converted = (int) (round(theDouble) + 0.1) 
4

はこれを行います。ダブルを返しますが、あなたの場合はintにキャストできます。または、lroundmath.hでも)を使用してください。これはdoubleをとり、long intを返します。

5
int converted = (int)round(theDouble); 
7

あなたはおそらくラウンド(ダブル機能)を探しています。 署名は次のようになります。

long int lround(double)。

他の人が提案してきたように

その他のオプションは

  • long int型lrint
  • (ダブル)長い長いint型llrint(ダブル)
  • 長い長いint型llround(ダブル)
関連する問題