Проблема с умножением 2 чисел в процедуре усечения

Мне нужно усечение 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

Решение

Проблема в том, что ни вход 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 * х вместо Икс.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]