如何查找输入的双精度是否为0.05的倍数



我有一个赋值,需要检查一些用户输入的双精度是否是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;
}

有什么办法做到这一点吗?价格需要翻倍。由于我正在做的任务是一个自动售货机项目,该项目收取硬币并退还零钱。

标准库有用于浮点模运算的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;

记住,您的双精度被存储为二进制值,不能在十进制和二进制之间精确转换。

你最好使用字符串。

首先检查输入值的格式是否为"*.NN"。如果是,请检查小数点后的第二个N是0还是5。

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;
}

最新更新