C ++ Избегать округления числа - PullRequest
0 голосов
/ 21 апреля 2020

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

Например: если мы используем setprecision(7), то он выдаст до 7 десятичных знаков для всех чисел в моем списке. Что если у меня есть список разных чисел с разными десятичными знаками, например, 8 или 10 знаков после запятой? Нужно ли делать setprecision для каждого из них? Есть ли способ сохранить мои цифры такими же, как и после расчета? Ex:0.1234567, 0.123456789, 0.12345678910

#include<iostream>
#include<vector>
using namespace std;
int main()
{
   vector<double> myVec{0.1234567, 0.123456789, 0.12345678, 0.12345678910};

   for(int i = 0; i < myVec.size(); i++)
   {
       cout << myVec[i] << " ";
   }
   return 0;
}

1 Ответ

0 голосов
/ 21 апреля 2020

Есть ли способ сохранить мои числа такими же, как выходные после вычисленных?

Не для типов с плавающей запятой, таких как double.

Это двоичные числа с плавающей запятой, а не десятичные. Многие точные десятичные дроби будут преобразованы в бесконечную двоичную дробь, и произойдет округление. Таким образом, после того, как вы сделаете dobule d = 0.1234567, переменная d не будет содержать ровно 0.1234567, это скорее что-то, близкое к 0.1234567, представляемому как double.

Чтобы справиться с этим, нужно иметь типы данных, которые являются десятичными дробями, с фиксированной или плавающей точкой, так что 0.1234567 может быть представлен точно.

...