c++ - 如何查找输入的 double 是否是 0.05 的倍数

标签 c++ int double modulus

我有一个任务,我需要检查一些用户输入的 double 是否是 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 不能用二进制 float 表示。因此,“0.05 的倍数”在实际数学中的含义与“最接近 0.05 的可表示值的浮点值的倍数”的含义截然不同。

鉴于计算的输入包含一些错误,该错误将在对这些输入进行浮点运算时增加。完全有可能即使 0.05 * x = y 在实际数学中成立,也不一定意味着在 float 学中成立。

因此,将浮点计算结果与单个值进行比较几乎没有意义。这适用于将余数与零进行比较。有意义的是与某个相对阈值进行比较,该阈值假定大于计算的累积误差。由于您可能正在处理低至百分之一的量化值(这在货币中很常见),因此合理的阈值是量化分辨率的一半。

double quantum = 0.01;
double threshold = quantum / 2;
bool is_multiple = std::fmod(price, 0.05) < threshold;

关于c++ - 如何查找输入的 double 是否是 0.05 的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54411499/

相关文章:

java - TableView列数据设置为小数点后2位

vba - Vba错误处理/仅int

c++ - std::array 与数组性能

c++ - 有人可以帮我并行化这个 C++ 代码吗?

c++ - 嵌入式 Python 段错误

python - 需要 int 的最大值

java - 使用数字-Javafx

html - css float 在顶部获得双边距(不是来自 body )

c++ - 大整数和 double 之间的乘法

c++ - 通过现有设备驱动程序访问设备