10

次のコードを検討してください。

#include <iostream>

using namespace std;

int aaa(int a) {
    cout << a * 0.3 << endl;
    return a * 0.3;
}

int main()
{
    cout << aaa(35000);
}

次のように出力されます。

10500
10499

出力が異なるのはなぜですか?

「return a * 3 / 10;」を使用する回避策があります。しかし、私はそれが好きではありません。

編集:

「return float(a * 0.3);」を実行していることがわかりました。期待値を与える;

4

3 に答える 3

9

0.3*35000 の結果は浮動小数点数で、10500 よりわずかに小さいです。出力されると 10500 に丸められますが、強制的に int に変換されると小数桁が破棄され、10499 になります。

于 2013-06-29T13:09:20.253 に答える
6

int * double式は double を生成します。それが最初に出力されます。次にint、残りの部分を切り刻むように変換し (10500-DBL_EPSILON に座っている場合でも)、それを返します。2 番目はその値を出力します。

float-int 変換は慎重に行う必要があります。

于 2013-06-29T13:07:26.607 に答える
2

a * 0.3タイプがありdoubleます。呼び出し内のaaa呼び出し

ostream& operator<< (double val);

一方、外側の呼び出し

ostream& operator<< (int val);

doubletoからの暗黙のキャストは推奨されintないという警告が表示されます (オンにすると、オンにすることをお勧めします)。

于 2013-06-29T13:08:01.670 に答える