Vaishudeepak Ответов: 2

Пломблем с двойной точностью


двойной var = 79999.95;
соиь <&ЛТ; Вар на << епси;

выход, который я получаю, составляет 79999.9, но я хочу, чтобы op был 79999.95. Мне нужна точная прецессия без округления.Я знаю, что setprecision(2) будет печатать выходные данные как 79999.95.но так как я хочу использовать это значение (79999.95)для дальнейших вычислений ,то как я могу получить значение val как 79999.95, так как я думаю, что setprecesion печатает только значение.

Что я уже пробовал:

Я пробовал из <double = floor((val * 1000) +0.5)/ 1000; >

2 Ответов

Рейтинг:
2

KarstenK

Распечатайте его в строковый буфер, и все готово.

char s[20];
sprint(s,"%0.2f",var);
cout << s << endl;


Рейтинг:
0

Jochen Arndt

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

  1. Они не могут точно представлять большинство значений
  2. Печатные значения округляются до заданного или заданного по умолчанию разрешения, на которое может повлиять вышеизложенное
79999.95-это одно из значений, где применяется первый пункт. Он не может быть представлен точно с помощью double Сохраненное значение равно 79999,949999999997, которое можно проверить, установив соответствующую выходную точность (17 значащих цифр). Для одинарной точности float, сохраненное значение будет равно 79999,95313.

Ограниченное разрешение и неточность не являются проблемой для простых математических операций. Но это может стать проблемой со сложными операциями, где ошибки округления могут накапливаться. Тогда реализация алгоритма должна позаботиться об этом.

Проблема отображения, вероятно, неправильного округленного значения не является проблемой, когда вы знаете о точности самого значения. И вы должны знать это для ваших входных значений.

Связанные чтения:
Руководство С Плавающей Запятой[^]
Что Каждый Компьютерщик Должен Знать Об Арифметике С Плавающей Запятой[^]