Явное приведение типов в C++

308
27 сентября 2017, 11:15

Пытаюсь получить в ответе переменную t2 не как тип int, а как float. Т.е. сейчас при вводе числа 457 у меня number two = 5, а я хочу получить 5.7. Код уже с примером, как я пытаюсь сделать, но всё равно выводит без десятых. Что я делаю не так?

int e, n;
float s, t2;
cout << "vvedite n\n";
cin >> n;
s = float(n) / 100 ;        // первая цифра
t2 = float ((n / 10) % 10); // вторая цифра
e = n % 10;                 // третья цифра
cout << "number one =   " << float(s) << endl;
cout << "number two =   " << float(t2) << endl;
cout << "number fri =   " << e << endl;
Answer 1

У вас переменная t2 и так является типом float. Операция "модуль" (%) не используется с типами с плавающей запятой. Выход - пользоваться функцией fmod из стандартной библиотеки. К тому же, чтобы получить 5.7 нужно несколько иначе считать.

#include <iostream>
#include <iomanip>
#include <cmath>
int main()
{
  using namespace std;
  int e, n;
  float s, t2, t2fmod;
  cout << "vvedite n  \n";
  cin >> n;
  s = n / 100 ;
  t2 = (n % 100) / 10.0; // (int) / (float) = (float); или static_cast<float>(10) -- глупо
  // или
  t2fmod = fmod(n, 100) / 10; // (float) / (int) = (float);
  e = n % 10;
  cout << "number one  =   " << s << endl;
  cout << "number two =   " << fixed << setprecision(1) << t2 << "(" << t2fmod << ")" << endl;
  cout << "number three =   " << e << endl;  
}

Явные приведения типов в стиле Си ((type)variable) нежелательны в C++. Лучше пользоваться операциями *_cast.

Answer 2

Из целого числа вы никогда не получите с помощью приведения вещественное с ненулевой дробной частью. Ей просто неоткуда там взяться. Если нужно получить хвост без старшего разряда, то самый простой вариант — просто выполнить вычитание целой части, связанной со старшим разрядом, перед делением:

int n = 457;
s = n / 100.0;  // 4.57
t2 = (n - static_cast<int>(s) * 100) / 10.0; // 5.7
e = n % 10; // 7

При желании можно обернуть в цикл, чтобы работать не только с трехразрядными числами.

READ ALSO
Имплементация SHA-1 (ошибка результата)

Имплементация SHA-1 (ошибка результата)

Здравствуйте, я написала алгоритм SHA-1, но он не правильно вычисляет сам хеш, можете посмотреть в чем может быть проблема, я уже несколько часов...

272
Декодирование JPEG

Декодирование JPEG

Подскажите свободно распространяемую библиотеку (совместимую с Windows) или исходник, в котором из JPEG файла выделялись квантованные косинусные...

213
C++ WMI не могу понять, где здесь утечка памяти

C++ WMI не могу понять, где здесь утечка памяти

Вот функция, перепробовал десятки вариантов, но не могу понять, где здесь утекает память? Проверял банальным вызовом функции 1000 раз, забирало...

201
Установка пароля на HDD языком C++

Установка пароля на HDD языком C++

Придумал задачу и пытаюсь ее решить: хочу поставить пароль на жесткий диск, и сделать это на C++При помощи каких библиотек/классов это можно...

171