0

を使用してファイルを読み込みましたが、既に読み取ったファイルの量をパーセントでifstream書き出したいと思います。cout

long length = 0, now = 0;
int i = 0;
double d = 0;

file.seekg( 0, std::ios::end );
length = file.teelg();
file.seekg( 0, std::ios::beg );

while ( std::getline( file, buffer ) ) {
    now = file.teelg;

    i = now / length * 100;
    d = now / length * 100;

    std::cout << length << " "      // working
              << now << " "     // working
              << ( now / length * 100 ) << " "  // not working = 0
              << i << " "           // not working = 0
              << d;         // not working = 0
}

now = lengthそれがそうであることを私に示した場合にのみ100%、しかしそれ以外の場合は失敗し、私に戻ってき0ます。答えはのように単純だと想像できます1*1が、今は解決策が見つかりません。私もキャスティングを試しましたが、それが問題だったのかもしれませんが、もちろん何もありません。

4

6 に答える 6

6

オペランドの1つがafloatまたはdouble、でない限り、/整数除算を行い、余りを破棄します。

このように書いてください:

( (double)now / length * 100 )
于 2012-11-29T16:20:33.253 に答える
6

整数除算でゼロの場合length > nownow / length最初にダブルにキャストします。

于 2012-11-29T16:20:33.777 に答える
2

計算を浮動小数点数に変換します

i = (float)now / length * 100;
d = (float)now / length * 100;

基本的に、intを除算する場合は、最も近い数値に切り捨てます。したがって、0または1しか持つことができません。次に、100を掛けます。

または、次のようにすることもできます。

i = 100 * now / length;
d = 100 * now / length;

これは、数値に100を掛けた後に切り捨てられます。

于 2012-11-29T16:21:03.917 に答える
1

試してみてください(now * 100) / length。これは、の結果がintに変換されるため、またはnow / lengthのみである可能性があります。01

于 2012-11-29T16:21:54.730 に答える
1

または、浮動除算を回避するために、最初に乗算してから除算することもできます。

(now * 100) / length
于 2012-11-29T16:22:53.797 に答える
1

あなたの表現

( now / length * 100 )

は左から右に評価されるため、次のようになります。

int tmp    = now / length
int result = tmp * 100

のため ...

5.6乗法演算子[expr.mul]

[...]整数オペランドの場合、/演算子は、小数部分が破棄された代数商を生成します[...]

...いずれの場合もnow < length、結果はゼロになります。

浮動小数点変換を追加すると、次のことが役立ちます。

5つの式[expr]

10:算術型または列挙型のオペランドを期待する多くの二項演算子は、同様の方法で変換を引き起こし、結果型を生成します。目的は、結果のタイプでもある共通のタイプを生成することです。このパターンは通常の算術変換と呼ばれ、次のように定義されます。

  • ..。
  • いずれかのオペランドがlongdouble型の場合、もう一方はlongdoubleに変換されます。
  • それ以外の場合、一方のオペランドがdoubleの場合、もう一方はdoubleに変換されます。
  • それ以外の場合、一方のオペランドがfloatの場合、もう一方はfloatに変換されます。
  • ..。

したがって、要約すると、任意の2つのプリミティブオペランド(またはオーバーロードされていないoperator/オペランド)の場合、一方のオペランドが浮動型の場合、もう一方のオペランドも浮動型に変換されます。

float(now) / length * 100

...すべてのオペランドをfloatに変換します:

float tmp    = float(now) / length
float result = tmp * 100.0f

ただし、浮動小数点演算を使用しないように計算を再配置することもできます。

i = 100*now / length;
d = 100*now / length

次に、必要に応じて整数を求めます。

なぜこれが数学的に機能するのか疑問に思う場合:

  100*now              now
 ----------  = 100 * --------
   length             length

左側はあなたが今持っているものであり、右側はあなたが持っていたものです。どちらも同等ですが、有限のデータ型になると、実行の順序が非常に重要になります。

于 2012-11-29T16:47:00.200 に答える