1

浮動小数点値の整数部分と小数部分を抽出しようとしていますが、おそらく浮動小数点数の不正確な格納方法が原因で、奇妙な丸めの問題が発生しているようです。

小数部分を抽出するために、次のようなコードがあります。

double number = 2.01;
int frac = int(floor(number * 100)) % 100;

ただし、ここの結果は 1 ではなく 0 として出力されます。これは、元の double が実際には次のように格納されるためと思われます。

2.0099999...

ただし、sprintf を実行すると、このような変換が正しく行われるようです。

char num_string[99];
sprintf(num_string,"%f",number);

上記の方法では正しい答えが得られないのに、sprintf はどのようにして正しい答えを得るのでしょうか?

4

2 に答える 2

2

> ただし、結果は 1 ではなく、ここで 1 つに出てきます。

どう言う意味ですか?

2.099999...

または、もっと好き2.00999...

あなたが指摘したように:

int frac = int(floor(number * 100)) % 100;

になります:

int frac = int(floor(2.00999... * 100)) % 100;
         = int(floor(200.999...)) % 100;
         = int(floor(200.999...)) % 100;
         = int(200) % 100;
         = 200 % 100;
         = 0;

あなたはこれに興味があるかもしれません。

また、以下から参照modfしてmath.hください。

double modf(double x, double *intptr) /* Breaks x into fractional and integer parts. */ 

modf() は、ジャグリングを自分で行うよりも優れた代替手段です。

于 2009-02-23T05:50:51.687 に答える
1

math.h から modf を使用することについては、ひどく同意します。ただし、ジャグリングを自分で行う必要がある場合は、このコードを試してください。これにより、表示されている問題が回避されるはずです。

int round(double a) {
    if (a > 0)
        return int(a + 0.5);
    else
        return int(a - 0.5);
}

int main()
{
    double number = 2.01;
    int frac = round((number - ((int)number)) * 100);
    printf("%d", frac);
}
于 2009-02-23T06:04:36.910 に答える