2017-02-17 4 views
0

Я делал программу, которая сначала берет 2 числа (с плавающим типом данных) от пользователя, а затем спрашивает пользователя о том, какую цифру он хочет, чтобы получить число, разделенное и, наконец, делит его до этого числа и 'cout < <' it. Он скомпилирован, но не работал до отметки, когда я рассчитал 22/7, что является иррациональным. до 100 цифр он просто рассчитал до 30 или 40 цифр, а затем остальную часть заполнили нулями. Что-то вроде этого: 3.1428570747375488281250000000000000000000000000000000000000000000000000000000000000000000000000000000setprecision() не работает как ожидалось

Вот мой код:

#include <iostream> 
#include <cstdlib> 
#include <iomanip> 
using namespace std; 
int main() 
{ 
    system("clear"); 
    float y; 
    int z; 
    float x; 
    float a; 
    cout << "\nHello User\n"; 
    cout << "\nEnter first num to be divided: "; 
    cin >> x; 
    cout << "\nCool!! Now enter the 2nd number: \n"; 
    cin >> y; 
    cout << "\Exelent!! Enter the place upto which u wanna caculate: "; 
    cin >> z; 
    a = x/y; 
    cout << fixed << showpoint; 
    cout << setprecision(z); 
    cout << "Calculating......\n" << a << endl; 
    return 0; 
} 
+0

Все номера с 6 или менее значащими десятичными цифрами могут быть преобразованы в значение с плавающей запятой IEEE 754 без потери точности. Прочитайте типы IEEE с плавающей запятой. –

+1

22/7 определенно не является иррациональным числом. – molbdnilo

+0

О, я имею в виду PI @molbdnilo – ShivamProgramer

ответ

3

Типы с плавающей точкой имеют определенную точность. Вы не получаете точных результатов при работе с поплавками (или удваивается). Теперь для получения более точной пользы используйте double вместо float (см. this post).

Вы можете #include <limits>, удалить шаг, который получает точность от ввода и изменить код:

std::cout << std::setprecision(std::numeric_limits<float>::max_digits10);

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