Почему разделение двух целых чисел не дает поплавка?
Может кто-нибудь объяснить, почему b округляется здесь, когда я делю его на целое число, хотя это float?
#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
Ответы
Ответ 1
Это происходит из-за неявного преобразования. Переменные b, c, d
имеют тип float
. Но оператор /
видит два целых числа, которые он должен делить, и, следовательно, возвращает целое число в результате, которое неявно преобразуется в float
путем добавления десятичной точки. Если вы хотите использовать float-деления, попробуйте сделать два операнда плавающими /
. Как следует.
#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;
}
Ответ 2
Используйте литье типов:
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 - это float, а не целое число. Следовательно, результатом деления будет float, а не целое число.
Ответ 3
"a" - целое число, когда делится на целое число, оно дает целое число. Затем он присваивается "b" как целое число и становится плавающим.
Вы должны сделать это так:
b = a / 350.0;
Ответ 4
Глава и стих
6.5.5 Мультипликативные операторы
...
6 Когда целые числа делятся, результатом оператора /
является алгебраическое отношение с любым
дробная часть отброшена. 105) Если фактор a/b
представимо, выражение
(a/b)*b + a%b
должен быть равен a
; в противном случае поведение как a/b
, так и a%b
недеформированной определены.
105) Это часто называют "усечением к нулю".
Разделение целого на целое число дает целочисленный результат. 1/2 дает 0; присвоение этого результата переменной с плавающей запятой дает 0.0. Чтобы получить результат с плавающей запятой, по крайней мере один из операндов должен быть типа с плавающей запятой. b = a / 350.0f;
должен дать вам результат, который вы хотите.
Ответ 5
В частности, это не округление вашего результата, оно обрезается до нуля. Итак, если вы разделите -3/2, вы получите -1, а не -2. Добро пожаловать в интегральную математику! Перед тем, как процессоры могли выполнять операции с плавающей запятой или появление математических процессоров, мы сделали все с интегральной математикой. Несмотря на наличие библиотек для математики с плавающей запятой, они были слишком дорогими (в инструкциях процессора) для общего назначения, поэтому мы использовали 16-битное значение для всей части числа и еще 16 значений для фракции.
EDIT: мой ответ заставляет меня думать о классическом старом, говорящем "когда я был твоим возрастом..."
Ответ 6
Вероятно, лучшая причина в том, что 0xfffffffffffffff/15
даст вам ужасно неправильный ответ...
Ответ 7
Разделение двух целых чисел приведет к получению целого числа (целого числа).
Вам нужно указать одно число как float или добавить десятичное число к одному из чисел, например,/350.0.