【问题标题】:How to find if an inputted double is a multiple of 0.05如何查找输入的双精度数是否为 0.05 的倍数
【发布时间】:2019-01-28 22:57:13
【问题描述】:

我有一个任务,我需要检查某些用户输入的双倍是否是 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;
}

有没有办法做到这一点?而且价格需要翻倍。由于我正在做的任务是一个自动售货机项目,它需要硬币并返回零钱。

【问题讨论】:

  • 为什么要将 5 乘以 两次?
  • 您是指 if else 语句吗?一个是看数是不是倍数,一个是相反的。
  • if (multiple == 0) 还不够吗?
  • 顺便说一句,由于您使用硬币,因此可能的最小值为 1 美分,因此您不必使用双精度数,而是使用一个整数以保持美分的值(如果它会让您的生活更轻松)。
  • 您提到的要求并不意味着您需要double。这类赋值的一个要点是发现浮点对这类问题没有好处,您需要找到一种方法来处理整数。

标签: c++ int double modulus


【解决方案1】:

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

【讨论】:

  • 如果 price 的值刚好低于 0.05 的倍数(例如 price = 0.0999..),此解决方案将失败。
【解决方案2】:

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

你最好使用字符串。

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

【讨论】:

  • 发帖人指出使用双精度是一项要求。
【解决方案3】:
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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多