Сбивающий с толку результат при преобразовании градусов в радианы в C

  int x;
  scanf("%d",&x);
  x=(double)((x*3.14)/180);
  printf("%.6lf",x);

Когда я запускаю приведенный выше код и ввожу x=60, я получаю -0,000000.

  int x;
  double a;
  scanf("%d",&x);
  a=(x*3.14)/180;
  printf("%.6lf",a);

Но когда я запускаю этот код выше, я получаю правильный ответ.

Я хочу знать, где я делаю неправильно. Есть ли проблема в моем типе приведения или использовании двойного или чего-то еще? Любая помощь будет оценена. Спасибо!

Н.Б. : мне нужно напечатать вывод до 6 цифр после запятой.

x есть int. Вы не можете сделать это double по своему желанию.
Paul Ogilvie 22.05.2019 10:41

В отличие от других языков (например, Python), C не меняет тип переменной, чтобы она соответствовала значению. Вместо этого он изменяет тип значения в соответствии с переменной. Поскольку x объявлен как int, любое значение, присвоенное x, будет преобразовано в int.

user3386109 22.05.2019 10:41
3.14?͏͏͏͏͏͏͏͏͏͏͏͏͏͏͏
Bathsheba 22.05.2019 10:43

@Bathsheba... это пи я использую

Nehal Samee 22.05.2019 10:45

Вы выполняете приведение типа к типу double, но x по-прежнему является целым числом, и когда вы печатаете с помощью lf, он ожидает двойное число, но это все еще целое число. Скомпилируйте с флагом -Wall в следующий раз, чтобы лучше понять.

Pratik Sampat 22.05.2019 10:45

Вы не используете pi. Вы используете 3.14.

Bathsheba 22.05.2019 10:46

@Pratik .. Можете ли вы дать какое-либо представление о том, как использовать флаг -Wall?

Nehal Samee 22.05.2019 10:47

@НехалСами. gcc -Wall program.c покажет некоторые важные предупреждения, которые вы, возможно, не заметили. Также следуя предложению @Bathsheba, если вы хотите использовать pi, включите math.h и вместо этого используйте M_PI.

Pratik Sampat 22.05.2019 10:51

@PratikSampat: За исключением того, что стандарт не требует M_PI, поэтому ваш код не будет переносимым. О радость!

Bathsheba 22.05.2019 10:58

@ Вирсавия, или вы могли бы просто # define M_PI 3.14159265358979323846 что в источнике math.h?

Pratik Sampat 22.05.2019 11:06

@PratikSampat: см. один из моих лучших ответов, написанный на теге C++, но отношение относится к C: stackoverflow.com/questions/49778240/…

Bathsheba 22.05.2019 11:16

Ах аккуратно! Сегодня я узнал кое-что новое. Спасибо @Bathsheba!

Pratik Sampat 22.05.2019 11:21
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
12
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем коде две проблемы:

x = (double)((x*3.14)/180);

(x*3.14)/180 уже является double, поэтому эта строка эквивалентна:

x = (x*3.14)/180;

но в любом случае тип x остается int, поэтому, если x был, например, 300, новые значения x будут 300 * 3.14/180 = 5.2333, которые будут усечены до 5.

Вторая проблема здесь:

printf("%.6lf",x);

Как объяснялось ранее, тип x — это int, но спецификатор формата "%.6lf" требует double. Если типы переменных не соответствуют спецификатору формата, поведение не определено.

Вторая версия вашего кода совершенно верна, но имейте в виду, что пользователь может вводить только целые числа.

Кстати: 3.14 - очень плохое приближение к PI, я уверен, что вы можете добиться большего.

Верен ли мой второй код? И следует ли мне использовать вместо этого 22/7 или 3.1416?

Nehal Samee 22.05.2019 11:00

Другие вопросы по теме