#c #dev-c
#c #dev-c
Вопрос:
Сейчас я изучаю C на DevC , и мне нужно решить простое упражнение, в котором число (int или float, которое в данном случае равно 10) умножается на коэффициент, который является дробью (в данном случае 1/6). Результат, который я получаю, равен 0.000000, когда я запускаю свой приведенный ниже код, что неверно. Это корректно работает с некоторыми дробями, такими как 4/2.
Что я делаю не так? Пожалуйста, обратите внимание: я не могу использовать некоторые продвинутые решения и функции, потому что мы их не изучали. Также я должен использовать константы как часть упражнения, потому что дробь уже известна в начале упражнения.Мой код должен быть таким же простым, как тот, который я использую сейчас:
#include <stdio.h>
#include <math.h>
const float a = 10;
const float b = 1/6;
float c;
main()
{
c = a * b;
printf("Answer = %f", c);
return 0;
}
Ответ №1:
const float b = 1/6;
1/6
является целочисленным делением и равно 0
Вам нужно использовать константы с плавающей запятой:
const float b = 1.0f/6.0f;
Константы с суффиксом f
имеют float
тип ( 1.0f
, 5.12f
) . Без суффикса имеют double
тип ( 1.0
, 5.12
)
Комментарии:
1. Спасибо! Нужно ли мне использовать () для дроби, чтобы она сначала выполняла это вычисление? Например
const float b = (1.0/6.0)
, или деление имеет приоритет автоматически?2. только если вы хотите установить порядок вычисления, например
(1.0 5.0)/2.0
3. Понял. Спасибо за помощь.
Ответ №2:
Константы 1
и 6
оба являются целыми числами, поэтому 1/6
выполняется целочисленное деление. Если вы хотите деление с плавающей запятой, одно или оба значения должны быть константами с плавающей запятой:
const float b = 1.0/6.0;
Ответ №3:
Вы выполняете деление на два постоянных целых числа, которые являются 1
и 6
, и результат такой операции равен 0
и это значение передается float
. Измените значение b
на const float b = 1.0 / 6.0;
.
Ответ №4:
Вам нужно использовать числа с плавающей запятой, такие как 1.0
(и not 1
, которые являются целыми числами) или 6.0
(и not 6
, которые также являются целыми числами)
Когда вы применяете оператор деления /
к двум целым числам, он выполняет целочисленное деление, что означает, что результатом должно быть целое число.
Если вы разделите целое 1
число на 6
, вы получите 0
, и остаток от 1
.
Лучшее, что вы можете сделать, это использовать литералы с плавающей запятой, когда вам нужны выражения с плавающей запятой, например:
#include <stdio.h>
#include <math.h>
const float a = 10.0; /* this time everything is double */
const float b = 1.0/6.0; /* you convert it into float on initialization */
float c;
main()
{
c = a * b; /* ... or when assigning */
printf("Answer = %f", c);
return 0;
}
и ваша программа будет работать нормально.