Это связано с тем, что ostr << originalNumber;
использует формат по умолчанию для чисел с плавающей запятой, который является научным примечанием для таких больших чисел.
#include <iostream>
#include <limits>
int main()
{
long double const originalNumber = std::numeric_limits<long double>::max() / 2;
std::cout << originalNumber << '\n'; // 5.94866e+4931
}
Демонстрационная версия
Когда вы анализируете это представление обратно в число с плавающей запятой, все следующие цифры теряются.На самом деле, если вы посмотрите на порядки:
originalNumber
составляет около 1e4931; originalNumber - convertedNumber
составляет около 1e4925.
Это означает, что только первые 6 (4931-4925) цифр originalNumber
являются правильными;что имеет смысл, если вы используете научную нотацию.
Решение - std::fixed
, как указано в вопросе SO "Как вывести двойное значение с полной точностью, используя cout? ":
ostr << std::fixed << originalNumber;
// ...
if (originalNumber == convertedNumber) // true
std::cout<< "The same\n";
else
std::cout<< "Not the same\n";
Демонстрационная версия
Осторожно, хотя математика с плавающей точкой может показаться неверной и сравнение двухЧисла с плавающей точкой с ==
часто не являются хорошим выбором.