Как использовать дроби в C?

#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;
}
  

и ваша программа будет работать нормально.