Преобразовать float в int

У меня есть цена за машину, скажем, 10000. Я хочу применить к этой цене 20% распродажу.

У меня есть struct, в котором auta->cena есть float.

int year, i, n=0, pocet=1, sale;

scanf(" %d", &year);
scanf(" %d", &sale);

for(i=1; i<=pocet; i++){
    if(year == auta->rok){
        ++n;
        pocet++;

        auta->cena *= ((float)(100 - sale) / 100); //calculate price after 20% sale
        //temp = ((int)(temp * 100 + 0.5)) / 100.0; //use this formula to round up final price, it doesnt work, I get 0.00


        printf("%.2f\n", auta->cena);
    }
        auta = auta->dalsi;
}

Я не умею конвертировать, может кто-нибудь объяснить мне, пожалуйста? Как мне это сделать?


comment
Вы уверены, что получили правильные значения до округления?   -  person LogicStuff    schedule 02.05.2015
comment
да, работает до округления   -  person domestos    schedule 02.05.2015
comment
Возможно, вы захотите напечатать значение temp после temp *= ((float)(100 - sale) / 100). Это может быть не то, что вы ожидаете...   -  person Bob Jarvis - Reinstate Monica    schedule 02.05.2015
comment
Я обновил код, но все равно не изменил логику, и я действительно получаю правильную цену после 20% продажи.   -  person domestos    schedule 02.05.2015
comment
((int)(temp * 100 + 0.5)) / 100.0 должно быть (int)((temp * 100 + 0.5)) / 100.0) ... При приведении int к float это должно быть первым, что вы делаете, и от поплавка до последнего.   -  person Tony Hopkinson    schedule 02.05.2015
comment
спасибо @TonyHopkinson, отлично работает :)   -  person domestos    schedule 02.05.2015


Ответы (1)


Если вы собираетесь напечатать значение с помощью %.2f, вам не нужно делать никаких округлений. Но если вы хотите округлить значение внутри, будет работать следующее. Я печатаю его с %.5f, чтобы показать, что значение действительно изменилось.

#include <stdio.h>

int main() {
  int discount;
  double price;

  printf("Enter a price: ");
  scanf(" %lf", &price);
  printf("Enter a percentage discount: ");
  scanf(" %d", &discount);

  price *= (100.0 - discount) / 100;  // calculate price after discount
  printf("after discount: %.5f\n", price);

  price = (int)(100 * price + 0.5) / 100.0;
  printf("rounded: %.5f\n", price);
}

Я использую double выше, чтобы сохранить достаточную точность, чтобы продемонстрировать, что расчет работает, например, с ценой 10000 и скидкой 20. Если вы сделаете это с float, вы потеряете достаточную точность, и нет смысла округлять до ближайший цент. Внутреннее значение в любом случае будет неточным.

Вот вариант того же кода с использованием float:

#include <stdio.h>

int main() {
  int discount;
  float price;

  printf("Enter a price: ");
  scanf(" %f", &price);
  printf("Enter a percentage discount: ");
  scanf(" %d", &discount);

  price *= (100.0 - discount) / 100;  // calculate price after discount
  printf("after discount: %.5f\n", price);

  price = (int)(100 * price + 0.5) / 100.0;
  printf("rounded up: %.5f\n", price);
  return 0;
}
person Michael Laszlo    schedule 02.05.2015
comment
В моем коде или в вашем коде? У меня нет переменных float. - person Michael Laszlo; 02.05.2015
comment
Я добавил версию, используя float. - person Michael Laszlo; 02.05.2015