Как я могу проверить - и получить остаток, используя fmod (float)? - PullRequest
0 голосов
/ 03 апреля 2019

Моя цель - проверить, есть ли остаток при делении 2-х чисел, и, если он есть, вернуть этот остаток пользователю.

Учитывая следующий код, я ожидал, что fmod(2, 0.2) будет 0, однако я получаю обратно 0.2. Я читал, что это связано с проблемами с плавающей запятой. Но есть ли способ сделать это правильно?

int main() {
    float a = 2.0;
    float b = 0.2;

    float rem = fmod(a, b);

    if (rem > 0) {
        std::cout << "There is a remainder: " << rem << std::endl;
    } else {
        std::cout << "No remainder: " << rem << std::endl;
    }
}

Выход: There is a remainder: 0.2

1 Ответ

1 голос
/ 03 апреля 2019

Да, ваша догадка верна.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 в соответствии с количеством десятичных знаков, необходимых для представления исходной задачи.

...