Мне нужно усечение 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. Что будет лучше для этого и почему?
Проблема в том, что ни вход 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 * х вместо Икс.
Других решений пока нет …