【问题标题】:How can i check if double is multiple 5?如何检查double是否是5的倍数?
【发布时间】:2015-03-21 19:17:22
【问题描述】:

如何检查双精度(到小数点后 2 位)是否是 5 的倍数??

众所周知,% 运算符不适用于双精度数据类型。

和

fmod() 似乎不太可靠....

我想要做的是检查 payment 是否是 0.05 的倍数。

这就是我正在尝试使用 fmod() 的方法,其中 remainder 和 payment 都是双精度数

remainder = fmod(payment, 5)

当我使用小数时,例如; .05, .10, .15, .20 我得到指数符号,即使我使用

   cout << setiosflags(ios::showpoint) << setprecision(3) << modulo << "  space   " << payment << endl; 

不知道我做错了什么

【问题讨论】:

  • 名称payment 表示您正在处理金钱问题。您应该永远用浮点数表示货币。改为使用固定精度类型。

标签: c++ double modulus


【解决方案1】:

如您所知,fmod() 并不是很有帮助。这是由于计算机如何存储浮点数。请参阅here 了解更多信息。

这里正确的解决方案是选择一些整数单位的货币。真正的银行可能会选择 0.00001 美元作为其整数单位。对您来说,使用 0.01 美元作为整数单位可能就足够了。

这意味着如果我们想要存储用户欠$10.05,我们会将其存储为:

int owed = 1005;

一旦你这样做了,在号码上使用%将非常容易,并且很容易得到准确的结果。

【讨论】:

  • 你将如何拆分它以显示为十进制数??
  • @MichaelDavidWoolweaver: printf("%d.%02d", owed / 100, owed % 100);
【解决方案2】:

怎么样:

int 余数 = ((int)(payment * 100)) % 5

【讨论】:

  • 很多人会告诉你类型转换是一种不好的做法,所以这里有点敏感。
  • @Mackiavelli:否决票与演员阵容几乎没有关系,而与浮点不精确度有很大关系。
【解决方案3】:

正如@Angew 所说,您永远不应该使用双精度数来表示货币价值。相反,使用整数将值表示为美分的数量。

也就是说,你应该做的是将答案乘以100,然后四舍五入到最接近的整数,然后计算模5。

即

((int)(payment*100 + 0.5)) % 5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2023-03-20
    相关资源
    最近更新 更多