【问题标题】:How to round decimals in a double returned from a virtual function?如何在从虚函数返回的双精度数中舍入小数?
【发布时间】:2015-11-08 02:26:38
【问题描述】:

/* 好的,我已经为此苦苦挣扎了一段时间来练习多态性。现在,hourly_worker 的计算支付实现如下所示

hourly_worker::compute_pay()
{

 tot_sal = hrs_wrk * hourly;  
 return tot_sal;
}

我希望它返回 2000.00 美元,但现在它只返回 2000 美元,因为函数设置为虚拟返回类型而不是双精度。有没有办法在不改变虚函数的情况下获得这些小数点?谢谢大家

*/ 现在这是我的驱动文件:http://pastebin.com/hUYhxVEu tot_sal 是 Worker 的私有 double 数据成员,compute_pay 是 Worker 的公共虚函数,由每个子类继承。请帮助大声笑。如果您需要/想查看更多代码,请告诉我。另外,这里是 hourly_worker 的实现文件。 http://pastebin.com/CtjiZUCG 只是添加,setprecision & fixed 或 showpoint 不要对返回值做任何该死的事情。

【问题讨论】:

  • 让我们退后一步:您从不使用浮点值来表示货币值。如果您的信用卡对帐单、薪水等都包含浮点不精确造成的错误,您会有什么感受?
  • 浮点是错误类型,实际上是双精度,我在编辑时更改了它。无论如何,我发现了我的错误,我需要将 compute_pay 定义为 worker.h 中的虚拟双精度,而不是直接虚拟。一个字lmao我就输了。感谢您的回复。
  • 双精度浮点数。
  • “虚拟返回类型”?虚表示函数具有多态行为。你仍然需要一个返回类型。
  • 对于课堂作业,这是可以的,但这里没有会计师会接受浮点数。

标签: c++ c++11 visual-c++ c++14


【解决方案1】:

你的函数没有virtual返回类型,它是virtual,这意味着当从指针或引用调用函数时,将调用对象的真实类型的函数,而不是那个指针的类型。

如果你不设置返回类型,一些不符合 C++ 标准的编译器将使用int 作为默认值(因为在 C 中曾经是这种情况)。如果您在复制/粘贴代码时没有截断代码,则可能是您的情况。因此,您的函数返回int。如果您希望它返回 double,只需更改其签名:

virtual double hourly_worker::compute_day();

当然,这只有在hourly 和/或hrs_wrk 是/是double 时才有用。否则,结果将是一个int,添加 .00 只是格式化显示的问题。

正如评论中所讨论的,您可能更喜欢定点算术而不是浮点算术来进行会计处理。这个想法很简单:使用int(或long int 能够处理亿万富翁)并将所有值乘以1000(或更多取决于您要处理的最小数量,我不是专家,但我认为十分之一美分通常是使用的)。

【讨论】:

  • 不,默认返回类型不是int,过去也不是。 (在其他语言中可能或曾经是这种情况,但问题是关于 C++)
  • 我没有说它是标准的 C++。它不使用符合标准的编译器进行编译,但一些编译器接受它,因为它在 C 中是有效的。如果发布的代码构建,则意味着使用的编译器是其中之一。但你是对的,我会在答案中准确地说出来。
  • @MSalters:这里有更多详细信息:stackoverflow.com/questions/331148/…
  • 以及更多关于否决票的详细信息:stackoverflow.com/help/privileges/vote-down 特别是:“如果有问题,请发表评论或编辑帖子以更正。”
猜你喜欢
  • 2011-01-22
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
相关资源
最近更新 更多