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
}
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
}
これは暗黙の変換によるものです。変数b, c, d
はfloat
型です。しかし、/
演算子は、除算する必要がある 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;
}
型のキャストを使用する:
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 が整数ではなく浮動小数点数であることを伝えています。したがって、除算の結果は整数ではなく浮動小数点数になります。
6.5.5 乗法演算子
...
6 整数が除算されると、/
演算子の結果は小数部分が破棄された代数商になります。105)商a/b
が表現可能である場合、式(a/b)*b + a%b
は等しいものとしa
ます。それ以外の場合、 と の両方の動作a/b
はa%b
未定義です。
105) これはしばしば「ゼロへの切り捨て」と呼ばれます。
整数を整数で割ると、整数の結果が得られます。1/2 は 0 を返します。この結果を浮動小数点変数に代入すると、0.0 になります。浮動小数点の結果を得るには、少なくとも 1 つのオペランドが浮動小数点型でなければなりません。 b = a / 350.0f;
必要な結果が得られるはずです。
2 つの整数を除算すると、整数 (整数) の結果が得られます。
1 つの数値を float としてキャストするか、a/350.0 のように数値の 1 つに小数を追加する必要があります。
おそらく一番の理由は、0xfffffffffffffff/15
あなたにひどく間違った答えを与えるからです...