Из-за чего float округляет до целых? Ответ типа 19.00, когда должен быть 19.13

Доп.задача из первой недели CS50: вычислить, сколько каждый будет должен в ресторане с учетом налога и чаевых. Опытным путем было обнаружено, что проблема именно с переменной tip. Заключается она в том, что программа видит ее как float (если запрашиваю return tip, выдает не 19, а именно 19.00), но округляет до целых, хоть кол на голове теши. Что может быть не так? Код прикладываю с return bill_sum / 2, как и требуется в задаче.

UPD Видимо, stackoverflow не для тупых, если я, пытаясь разобраться, сижу до глубокой ночи, вставая по утрам в 6, просто потому что мне интересно и ХОЧЕТСЯ разобраться, и при этом за второй мой вопрос из трех голосуют -1, будто разобраться я не пыталась...

// Data types, operations, type casting, return value

#include <cs50.h>
#include <stdio.h>

float half(float bill, float tax, int tip);

int main(void)
{
    float bill_amount = get_float("Bill before tax and tip: ");
    float tax_percent = get_float("Sale Tax Percent: ");
    int tip_percent = get_int("Tip percent: ");

    printf("You will owe $%.2f each!\n", half(bill_amount, tax_percent, tip_percent));
}

// TODO: Complete the function
float half(float bill, float tax, int tip)
{
    float tax_percent = tax;
    float bill_amount = bill;
    int tip_percent = tip;
    //Convert tax percent into float. Bill times tax.
    tax = bill * tax / 100;

    //Add tax to the bill
    float bill_tax = bill + tax;

    //Convert tip percent into float. Bill times tip.
    tip = (float)tip;
    tip = bill_tax * tip / 100;

    //Add tip to the bill and the tax
    float bill_sum = tip + bill_tax;

    //Divide it in two
    return bill_sum / 2;
}

Ответы (1 шт):

Автор решения: DmitryK

Интересно как!

Опытным путем было обнаружено, что проблема именно с переменной tip. Заключается она в том, что программа видит ее как float (если запрашиваю return tip, выдает не 19, а именно 19.00), но округляет до целых, хоть кол на голове теши.

Каким же образом программа видит переменную tip как float, если она явно объявлена как int?

float half(float bill, float tax, int tip)

Из-за чего float округляет до целых?

Ничего никто не округляет, просто вы в расчетах используете переменную типа int, и при присвоении дробного значения переменной целого типа дробная часть числа отбрасывается.
C++ - язык со статической типизацией - если объявили переменную, то тип у неё уже не изменить. Вот эта ваша запись абсолютно бессмысленна - нельзя сконвертировать переменную. Можно сконвертировать значение переменной, присвоив его другой переменной типа float.

// вот это - бессмысленно tip по-прежнему остается int
    tip = (float)tip; //Convert tip percent into float. Bill times tip.

// должно быть как-то так
float tip_percent = tip;

И если вы пытаетесь вернуть tip, как раз и происходит приведение типа из int во float, т.к. ваша функция возвращает float.

float half(float bill, float tax, int tip)
{
    ....
    return tip;
}

Вам в самом начале функции необходимо завести переменную типа float и далее в расчетах использовать её везде, вместо tip.

float half(float bill, float tax, int tip)
{
    float tip_percent = tip;
    // далее везде использовать tip_percent вместо tip
    ....
}

Вы уже задавали вопрос с этим кодом и я уже писал там рабочий код. Почему опять он возник? ранее заданный вопрос

→ Ссылка