3

誰かがC++でそのようなことが起こる理由を私に説明できますか?

double tmp;
...                    // I do some operations with tmp 
                       // after which it has to be equal to one
cout << tmp;           // prints 1
cout << trunc(tmp);    // prints 0
cout << trunc(tmp*10); // prints 9

私はこれを小数部の右側の数値から分離するために使用しています。たとえば、次の場合:5.010 ...0.010にしたい..だから私は次を使用しています:

double remainder = tmp - trunc(tmp);

コード全体を投稿しています....フロアの提案が機能しません

short getPrecision(double num, short maxPrecision) {

  // Retrieve only part right of decimal point
  double tmp  = fabs(num - trunc(num));
  double remainder = tmp;

  // Count number of decimal places
  int c = 0;
  while (remainder > 0 && c < maxPrecision) {
    tmp *= 10;
    remainder = tmp - trunc(tmp);
    c++;
  }
  return c;
}

たとえば5.1でこの関数を実行すると、リマニダーは1ではなく0になります。

4

2 に答える 2

6

いくつかの計算の後、それは1つでなければなりませんか?まあ、それもそうかもしれません0.99999999999999999。浮動小数点演算は正確ではないため、常にそれを考慮に入れる必要があります。

于 2012-08-08T09:21:51.407 に答える
1

http://en.cppreference.com/w/cpp/numeric/math/truncの画像を参照してください。そこのチャートは、ing1との不一致を説明していtruncます。おそらく同じことが10にも当てはまります。

これは、必要なことを達成するのに役立つはずです。

double remainder = tmp - floor(tmp);
于 2012-08-08T09:25:00.950 に答える