Проблема с умножением 2 чисел в процедуре усечения - PullRequest
0 голосов
/ 02 января 2019

Мне нужно усечение 2 десятичных цифр после запятой. Я использую следующий код в C ++:

auto doubleTmp = value * 100.00;
int64_t tmp = static_cast<int64_t>(doubleTmp);
double res = ( static_cast<double>(tmp) ) /100.00;

но, например, когда я устанавливаю значение = 70,82, doubleTmp равен 70,8199999, а результат равен 70,81. Что будет лучше для этого и почему?

1 Ответ

0 голосов
/ 02 января 2019

Проблема в том, что ни вход value, ни результат res не могут быть точно представлены в памяти компьютера для 70,82.Как предложил @MatthieuBrucher, вы должны использовать std::lround;рассмотрим следующий код:

auto value = 70.82;
std::cout << std::fixed << std::setprecision(20) << value << std::endl;

auto tmp = std::lround(value * 100.0);
std::cout << tmp << std::endl;

double res = static_cast<double>(tmp) / 100.00;
std::cout << std::fixed << std::setprecision(20) << res << std::endl;

, который дает следующий вывод:

70.81999999999999317879
7082
70.81999999999999317879

Однако вы можете сохранить результат в виде пары целых чисел, где первое будет представлятьнеотъемлемая часть, а вторая дробная часть:

auto res_integral = tmp / 100;
auto res_fractional = tmp % 100;
std::cout << res_integral << "." << res_fractional << std::endl;

Или просто сохраните ее как tmp с учетом того, что вы храните 100 * x вместо x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...