файл io — C ++ Float Truncation & amp; установить точность логической ошибки

Я некоторое время искал и не мог найти ответ здесь, но это кажется странным вопросом. Я работаю с библиотекой 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 () не работает так, как ожидается в этом случае?

Любые ответы с благодарностью, я извиняюсь за такое длинное объяснение.

2

Решение

Вам также необходимо установить fmtflags в fixed:

std::cout << std::fixed << std::setprecision(2) << purchasePrice << "\n";

Без указания scientific или же fixedмеханизмы вывода будут использовать любую схему, которая будет считаться лучшей. Вы знаете, что является «лучшим», и это схема с фиксированной запятой. Для более подробной информации смотрите http://en.cppreference.com/w/cpp/io/manip .

Еще лучше не использовать числа с плавающей запятой вообще при работе с деньгами. Гораздо лучше использовать пакет с арифметикой с фиксированной запятой.

3

Другие решения

Обычно float имеет 24 двоичных бита точности, что означает, что он может хранить около 6 десятичных цифр точности, поэтому, если ваше число больше 100000, вы вообще не получите никакой точности для десятичных цифр.

Вы должны использовать двойной который имеет около 15 десятичных цифр точности в этом случае вместо поплавок

Скорее всего, это отвечает на ваш конкретный вопрос, но если это за деньги, вам, вероятно, вообще не следует использовать плавающий формат, поскольку они не могут; например, точно представляют 0,01 в качестве значения, поэтому все ваши расчеты будут приблизительными, и вы, вероятно, не хочу этого при работе с деньгами. Обычно держите число пенсов / центов / что угодно в целых числах и будьте осторожны 🙂 Или даже лучше класс, специально разработанный для обработки денежных значений, поскольку часто существуют законные требования к округлению и т. Д.

0

По вопросам рекламы [email protected]