Я некоторое время искал и не мог найти ответ здесь, но это кажется странным вопросом. Я работаю с библиотекой fstream в C ++. Я пытаюсь взять данные из входного файла, назначить им переменные и вывести их как на экран, так и в выходной файл. Это все для проекта, над которым я работаю, который рассчитывает ежемесячный платеж по кредиту на автомобиль, поэтому переменные называются так, как они есть.
Мой файл данных выглядит так:
105670,00 12345,00 0,057 4
и, по сути, происходит то, что я теряю все после десятичного числа первых двух чисел (независимо от того, что я положил в качестве десятичного), но это не происходит с третьим числом. Кроме того, когда я пытаюсь установить precision (2) из первых двух чисел, я получаю странную логическую ошибку, которую я покажу после моего кода.
мой код выглядит так:
#include<fstream>
#include<iomanip>
#include<iostream>
using namespace std;
int main ()
{
ifstream din; // These are my input and output files
ofstream dout;
float purchasePrice; // The first number of the input file.
float downPayment; // Second number.
float annualInterest; // Third number.
float numYears; // Last number.
// declaring the input/output files code here
din >> purchasePrice >> downPayment >> annualInterest >> numYears;
cout << purchasePrice << endl;
cout << downPayment << endl;
cout << annualInterest << endl;
cout << setprecision(2) << purchasePrice << endl;
cout << setprecision(2) << downPayment << endl;
cout << setprecison(2) << annualInterest << endl;
}
и вот мой вывод:
105670
12345
0,057
1.1e + 005
1.2e + 004
0,057
Я хочу, чтобы мой вывод был:
105670,00
12345,00
0,057
105670,00
12345,00
0,05
Кроме того, при выполнении каких-либо вычислений числа действуют так, как будто у них все еще есть все после десятичной дроби. Мой вопрос: почему только некоторые из плавающих элементов усекаются, и почему setprecision () не работает так, как ожидается в этом случае?
Любые ответы с благодарностью, я извиняюсь за такое длинное объяснение.
Вам также необходимо установить fmtflags
в fixed
:
std::cout << std::fixed << std::setprecision(2) << purchasePrice << "\n";
Без указания scientific
или же fixed
механизмы вывода будут использовать любую схему, которая будет считаться лучшей. Вы знаете, что является «лучшим», и это схема с фиксированной запятой. Для более подробной информации смотрите http://en.cppreference.com/w/cpp/io/manip .
Еще лучше не использовать числа с плавающей запятой вообще при работе с деньгами. Гораздо лучше использовать пакет с арифметикой с фиксированной запятой.
Обычно float имеет 24 двоичных бита точности, что означает, что он может хранить около 6 десятичных цифр точности, поэтому, если ваше число больше 100000, вы вообще не получите никакой точности для десятичных цифр.
Вы должны использовать двойной который имеет около 15 десятичных цифр точности в этом случае вместо поплавок
Скорее всего, это отвечает на ваш конкретный вопрос, но если это за деньги, вам, вероятно, вообще не следует использовать плавающий формат, поскольку они не могут; например, точно представляют 0,01 в качестве значения, поэтому все ваши расчеты будут приблизительными, и вы, вероятно, не хочу этого при работе с деньгами. Обычно держите число пенсов / центов / что угодно в целых числах и будьте осторожны 🙂 Или даже лучше класс, специально разработанный для обработки денежных значений, поскольку часто существуют законные требования к округлению и т. Д.