Почему я получаю ошибку двойного типа данных C , когда удвоения имеют точность 15 цифр

#c

#c

Вопрос:

 #include<iomanip>
#include <iostream>

using namespace std;

int main()
{
   double b = 1.9876543212987 ;
   cout<<"double: "<<setprecision(12)<<b<<endl;
}
 

Это код, и вывод: double: 1.9876543213 В конце должно быть 3212. Почему это происходит с определенными числами, а не с другими.

Если я установлю значение b double b = 3.91234823929; с той же точностью, это даст мне правильное значение. Нужна помощь от профессионалов c .

Комментарии:

1. Похоже, что оно округляется до ближайшей значащей цифры.

2. Почему это должно быть 3212 в конце? следующая цифра 9 и, поскольку она больше 5 , вы округляете 2 до a 3 .

3. Также смотрите Примеры здесь en.cppreference.com/w/cpp/io/manip/setprecision Конкретика std::setprecision(10) и max precision: результаты

4. Я понял часть округления, но я не понимаю, почему это всего лишь 11 цифр, когда я установил точность равной 12? Спасибо за ответы, кстати, не ожидал, что это будет так быстро.

5. Также есть ли способ остановить округление цифр?

Ответ №1:

1.9876543212987 до двенадцати знаков после запятой 1.987654321230 . Затем завершающий ноль отбрасывается, так что вы получаете 1.98765432123 . Это объясняет, почему вы получаете только 11 знаков после запятой.

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