Почему разделение двух целых чисел не дает поплавка? - программирование
Подтвердить что ты не робот

Почему разделение двух целых чисел не дает поплавка?

Может кто-нибудь объяснить, почему 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

4b9b3361

Ответ 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.