Да, ваша догадка верна.std::fmod
вычисляет
std::fmod(2.0f, 0.20000000298023223876953125f)
, где второй параметр является ближайшим IEEE754 (предположим, что ваша платформа использует это) float
до 0.2
.
К счастью, хотя математический модуль является распределительным по всемуумножение, поэтому вы можете представить как
double rem = (long long)std::round(a * 10) % (long long)std::round(b * 10) / 10.0;
, используя большую степень 10 в соответствии с количеством десятичных знаков, необходимых для представления исходной задачи.