【问题标题】:std::cin for double and stringstd::cin 用于双精度和字符串
【发布时间】:2015-01-14 14:28:04
【问题描述】:

我正在做一个关于货币兑换的练习。程序应该从输入流中读取货币的数量和名称,并以本国货币返回其值。

double amount = 0.0;
std::string currency = " ";

std::cout << "Please enter amount and currency ('usd','eur' or 'rub'):" << std::endl;
std::cin >> amount >> currency;
std::cout << amount << currency << std::endl;

if ( currency == "usd") {
    ...;
} else if ( currency == "eur" ) {
    ...;
} else if ( currency == "rub" ) {
    ...;
} else {
    std::cout << "Input error: unknown currency..." << std::endl;
}

我在这个程序中遇到了一个关于 std::cin 的奇怪问题。当输入“100usd”或“100rub”时,程序分别回显“100usd”或“100rub”并继续正常工作。但是当我输入“100eur”时,它会回显“0”并给出“输入错误...”行。同时,如果我输入“100 eur”,程序会回显“100eur”并且工作正常。在前两种情况下,我是否添加空格没有区别。

我做错了什么?

【问题讨论】:

  • 那是因为你可以用科学记数法写一个 double (涉及字母 e)但 eur 中的其余字母对此无效,因此解析失败。
  • 这就是为什么你不使用std::istream::operator&gt;&gt;而是使用std::getline然后自己解析输入。另外,不要使用浮动-因为它是不准确的,所以点数的钱。
  • @TheParamagneticCroissant:“不要用浮点数来赚钱”——为什么不呢?只有在处理真实交易或有其他原因需要准确表示时才会出现问题。

标签: c++ cin


【解决方案1】:

在 100eur 的情况下,它认为您正在尝试用科学记数法编写 double:1.0e-10,但无法解析其余部分(因为 ur 对于指数“部分”无效)。

在其他情况下,它会停在 100(当它到达 u/r 时),这对于双精度数有效,因此解析成功。

【讨论】:

  • 谢谢,现在看起来很明显)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 2018-06-13
  • 1970-01-01
相关资源
最近更新 更多