33

float なのに整数で割ると b が四捨五入される理由を誰か説明できますか?

#include <stdio.h>

void main() {
    int a;
    float b, c, d;
    a = 750;
    b = a / 350;
    c = 750;
    d = c / 350;
    printf("%.2f %.2f", b, d);
    // output: 2.00 2.14
}

http://codepad.org/j1pckw0y

4

7 に答える 7

44

これは暗黙の変換によるものです。変数b, c, dfloat型です。しかし、/演算子は、除算する必要がある 2 つの整数を認識し、結果として整数を返します。この整数はfloat、小数点を追加して暗黙的に a に変換されます。浮動小数点数の除算が必要な場合は、2 つのオペランドを浮動小数点数にしてみてください/。以下のように。

#include <stdio.h>

int main() {
    int a;
    float b, c, d;
    a = 750;
    b = a / 350.0f;
    c = 750;
    d = c / 350;
    printf("%.2f %.2f", b, d);
    // output: 2.14 2.14
    return 0;
}
于 2013-04-25T18:17:16.497 に答える
18

型のキャストを使用する:

int main() {
    int a;
    float b, c, d;
    a = 750;
    b = a / (float)350;
    c = 750;
    d = c / (float)350;
    printf("%.2f %.2f", b, d);
    // output: 2.14 2.14
}

これは、それを解決する別の方法です。

 int main() {
        int a;
        float b, c, d;
        a = 750;
        b = a / 350.0; //if you use 'a / 350' here, 
                       //then it is a division of integers, 
                       //so the result will be an integer
        c = 750;
        d = c / 350;
        printf("%.2f %.2f", b, d);
        // output: 2.14 2.14
    }

ただし、どちらの場合も、コンパイラに 350 が整数ではなく浮動小数点数であることを伝えています。したがって、除算の結果は整数ではなく浮動小数点数になります。

于 2013-04-25T18:14:54.910 に答える
2

章と節

6.5.5 乗法演算子
...
6 整数が除算されると、/演算子の結果は小数部分が破棄された代数商になります。105)a/bが表現可能である場合、式 (a/b)*b + a%bは等しいものとしaます。それ以外の場合、 と の両方の動作a/ba%b未定義です。

105) これはしばしば「ゼロへの切り捨て」と呼ばれます。

整数を整数で割ると、整数の結果が得られます。1/2 は 0 を返します。この結果を浮動小数点変数に代入すると、0.0 になります。浮動小数点の結果を得るには、少なくとも 1 つのオペランドが浮動小数点型でなければなりません。 b = a / 350.0f;必要な結果が得られるはずです。

于 2013-04-25T19:28:10.640 に答える
0

2 つの整数を除算すると、整数 (整数) の結果が得られます。

1 つの数値を float としてキャストするか、a/350.0 のように数値の 1 つに小数を追加する必要があります。

于 2013-04-25T18:22:57.787 に答える
0

おそらく一番の理由は、0xfffffffffffffff/15あなたにひどく間違った答えを与えるからです...

于 2013-04-25T18:14:51.300 に答える