Дробные числа
int хранит только целые числа. Но у цены могут быть копейки, а рост может быть 1,68 м. Для чисел с дробной частью в C есть тип double:
double price = 12.5;В C дробные числа всегда пишут с десятичной точкой: 12.5, -0.25, 3.0.
Чтобы вывести double, используйте %f вместо %d (f — от floating point, «плавающая точка»: так компьютеры хранят дробные числа). %f всегда выводит шесть знаков после точки. Обычно нужно меньше, поэтому их число пишут между % и f после точки: %.2f выводит два знака после точки, %.1f — один. Число при этом округляется:
double price = 12.5;
double pi = 3.14159;
printf("%f\n", price);
printf("%.2f\n", price);
printf("%.1f\n", price);
printf("%.2f\n", pi);Выведется:
12.500000
12.50
12.5
3.14Для цен %.2f подходит как раз: два знака после точки, как в чеке.
Спецификатор должен подходить значению: %d для int, %f для double. Сам printf не может проверить, что получает; он доверяет форматной строке. На другом компьютере неправильный спецификатор мог бы вывести бессмысленное число, поэтому на этом сайте это ошибка компиляции:
#include <stdio.h>
int main(void) {
double price = 12.5;
printf("Цена: %d\n", price);
return 0;
}Компилятор сообщает:
main.c:5:30: error: format specifies type 'int' but the argument has type 'double' [-Werror,-Wformat]Формат требует int, а значение (аргумент) имеет тип double. Под первой строкой компилятор даже предлагает %f. Работает и наоборот: %f с int заканчивается сообщением format specifies type 'double' but the argument has type 'int'.
Ещё типичные ошибки:
- Десятичная запятая: в России, как и во многих странах, дроби пишут через запятую, 12,5. В C
double price = 12,5;заканчивается ошибкойexpected identifier or '(', потому что запятая в C означает другое. - Дробное число в
int:int price = 12.5;компилируется, но сохраняется только12. Дробная часть отбрасывается.
Задание
- 1
Ниже создайте переменную
priceтипаdoubleсо значением24.9— цену одной тетради. - 2
На следующей строке выведите её с помощью
%fтак:Цена: 24.900000. - 3
Шесть знаков после точки для цены — слишком много. Замените
%fна%.2f, чтобы строка показывалаЦена: 24.90. - 4
На следующей строке выведите, сколько стоят три тетради:
count * price. Вычисление сdoubleдаётdouble, поэтому снова используйте%.2f:Итого: 74.70