2012-01-22 5 views
0

Я новичок в C++ и программировании в целом. Я пытаюсь выполнить небольшие программы, чтобы испортить мне руку. Ниже приведена программа, которую я создал для расчета объема конуса.C++ проблемы с плавающей запятой

Проблема: независимо от того, что я делаю, выход всегда является целым числом. Я хочу получить его с точностью до двух десятичных знаков. Я попытался изменить переменные на двойной и длинный двойной, чтобы получить более высокую точность, и ничего не работает.

Как это исправить? И почему это происходит? (Если возможно, подробно) Я даже попросил нескольких младших преподавателей в UNi, пока никто не дал мне надлежащего ответа.

int main(){ 
    float radius,length,volume ; 
    const float PI =22/7.0f; 
    cin >> radius >> length; 
    volume =1/3.0f *radius*radius*length; 
    cout << "Volume is " << volume <<endl; 
    return 0; 
} 

Я использую г ++ на Fedora

EDIT: Я попробовал это earlyer с входами, как 50 60/70 50/120 40, который дает целые числа. Меньшие входы, такие как 3 4, дают десятичные значения.

EDIT: setprecision() работает. спасибо за всех, кто отправил это

+3

Этот код печатает много десятичных знаков. (И это приближение для PI довольно слабое.) – Mat

+0

OMG, IT'S TRUE O.O http://thedailywtf.com/Articles/The-Object-Test,-a-New-PI,-and-More-SHEEIT.aspx –

ответ

1

Программа, размещенная выше (добавление th e отсутствует #include <iostream> и using namespace std;), выдает несколько цифр после десятичной точки для меня. Если вы хотите, чтобы произвести ровно два десятичных знака после запятой нужно использовать что-то вроде этого:

std::cout << std::fixed << std::setprecision(2); 

где-то до вашего выхода (последний манипулятором объявлен в <iomanip>). Точность по умолчанию - использовать 6 цифр и решить, как их наилучшим образом распределить (это может означать, что вывод идет к научной нотации, если значения становятся слишком большими или слишком маленькими).

BTW, не используйте std::endl, если вы действительно не хотите очистить выходной поток. Я обнаружил несколько случаев, когда неправильное использование std::endl превратилось в серьезную проблему с производительностью.

2

Я не вижу ничего плохого в вашем коде, и я не могу воспроизвести поведение, о котором вы сообщаете.

Сказав, что, если бы я тебя, я бы поэкспериментировать с setprecision():

cout << "Volume is " << setprecision(8) << volume <<endl; 
Смежные вопросы