Как узнать, является ли введенное значение double кратным 0,05? - PullRequest
0 голосов
/ 29 января 2019

У меня есть задание, в котором мне нужно проверить, является ли двойное число, введенное некоторыми пользователями, кратным 0,05.

Например, если они введут 1,96, они получат ошибку.Но если они введут 1,95, то переходят к следующему шагу.

Я пытался делать разные мысли, как

double price;
cin >> price;
int multiple = ((int)(price * 100)) % 5;


if (multiple == 0)
{
    cout << "This is a multiple of 0.05" << endl;
}
else if (multiple != 0)
{
    cout << "No multiple" << endl;
}

Есть ли способ сделать это?И цена должна быть двойной.В качестве задания я выполняю проект торгового автомата, который берет монеты и возвращает сдачу.

Ответы [ 3 ]

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

Стандартная библиотека имеет функцию fmod для модуля с плавающей запятой (remainder не так полезна, поскольку не гарантирует тот же знак, что и операнд числителя).

Однако вы должны учитывать, что 0.05 не представимо в двоичной переменной с плавающей точкой.Следовательно, значение «кратный 0,05» в реальной математике принципиально отличается от значения «кратного значения с плавающей запятой, которое является ближайшим представимым значением к 0,05».

Учитывая, что входные данные вычислениясодержит некоторую ошибку, эта ошибка будет увеличиваться при операциях с плавающей запятой на этих входах.Вполне возможно, что даже если 0,05 * x = y верно в реальной математике, это не обязательно означает, что это верно в математике с плавающей запятой.

Таким образом, редко имеет смысл сравнивать результаты вычислений с плавающей запятойс одним значением.Это справедливо для сравнения остатка с нулем.Имеет смысл сравнить некоторый относительный порог, который предполагается больше, чем накопленная ошибка расчета.Поскольку вы, вероятно, имеете дело с квантованными значениями вплоть до одной сотой (как это обычно бывает с валютой), разумный порог составляет половину разрешения квантования.

double quantum = 0.01;
double threshold = quantum / 2;
bool is_multiple = std::fmod(price, 0.05) < threshold;
0 голосов
/ 29 января 2019
double price;
cin >> price;
int multiple = (int)(price * 100) % 5 == 0 && (int)(price * 100) != 0 && (price -(double)(int)(price * 100) / 100) == 0;


if (multiple == 0)
{
    cout << "This is a multiple of 0.05" << endl;
}
else if (multiple != 0)
{
    cout << "No multiple" << endl;
}
0 голосов
/ 29 января 2019

Помните, что ваши двойники хранятся как двоичные значения, которые не преобразуются точно между десятичным и двоичным.

Вам лучше работать со строкой символов.

Сначала убедитесь, что введенные значения имеют формат "* .NN".Если это так, проверьте, является ли второе N после десятичной точки 0 или 5.

...