0

Привет) Нужно вывести дробную часть числа. Например, при вводе 643.12 программа должна выдать результат 0.12 . Почему в примере ниже не хватает точности float для этой операции? Откуда там появляются знаки? Я слышал, что в компьютере числа хранятся не точно, это связано с этим?

#include <iostream>
#include <cmath>

using namespace std;

int main() { float n;

cin &gt;&gt; n;

cout &lt;&lt; n - trunc(n) &lt;&lt; endl;

return 0;

}

Пример

  • Проверьте в отладчике, какое число хранится в n после ввода 643.12, удивитесь... А вообще вам стоит почитать какой-нибудь ликбез по числам с плавающей точкой. – user7860670 Jul 31 '21 at 10:45
  • Попробуйте перевести 0.12 в двоичное число. Увидите бесконечное количество знаков после точки. Ни float, ни double не смогут представить его точно. – HolyBlackCat Jul 31 '21 at 10:51
  • У вас только положительные числа? – maestro Aug 01 '21 at 07:31

1 Answers1

0

Я бы делал примерно так:

float n;
cin >> n;
cout << fixed << setprecision(2) << n - trunc(n) << endl;

Это - если 1. задано именно число с плавающей точкой и 2. вы знаете, сколько именно знаков после запятой вы хотите вывести.

Если не знаете число знаков - то задание бессмысленное: вы не знаете, что именно было введено/вычислено - 0.12 или 0.1199995...

Но если вам надо именно дробную часть введенного числа - обрабатывайте ее как строку, а не как число. Типа,

string n;
cin >> n;
cout << "0";
if (size_t p = n.find("."); p != n.npos)
    cout << n.substr(p);
cout << endl;

Правда, тут могут быть варианты с разными форматами ввода типа научного или со знаком...

Harry
  • 221,325
  • Опять анонис... аноним минусы ставит, не поясняя, почему? :) – Harry Jul 31 '21 at 14:14
  • Спасибо за ответ! Проблема в том, что я прохожу курс, а строки будут только дальше. – bulka_s_makom Aug 05 '21 at 09:18