数字为std :: string或double

Number as a std::string or double?

本文关键字:double string 数字 std      更新时间:2023-10-16

我正在为HTTP客户端编写C 库。我在编程方面没有太多经验,所以请帮助我。

我的方法名为add。它有两个参数。第一个是类型的名称,第二个是参数q。它是0到1< 0,1>之间的数字。DOT之后应该有0到4位数字。

我可以写它,但我不知道更好:

  1. void add(std::string type, double q)->我必须将Q转换为std :: string此方法的字符串。

  2. void add(std::string type, std::string q)->没关系,它更快但对用户的直观速度较低,因为它是一个数字(?)....

有两种方法是一个好主意:1)和2)?

请帮助我。我没有经验...我知道这两种方法有效,但是更好,更受欢迎。你怎么认为?您将如何编写此?

通常,您想清楚地表明用户仅通过查看方法签名而对用户的期望。您的代码应为使用它的人提供有用的命中(即使您的代码在做什么以及对它们的期望更为明显)。

让我们从最糟糕的开始:

void add(std::string type, std::string q)
  • 没有明确表明q应该是一个数字。
  • q不是一个非常描述的名称。

在上面的示例中,呼叫者可能会感到困惑,并使用反向参数调用该方法:add("5.0123", "someType")没有告诉用户他们做错了什么,直到必须使用参数为止。最糟糕的是,您不知道现在情况会在哪里爆炸。这可能会导致一些很难跟踪错误,仅仅是因为未执行适当的类型。

稍好:

void add(std::string type, double q)
  • 现在很明显,用户正在添加类型和双重值。
  • q仍然不是描述性名称

我会推荐:

void add(std::string type, double value)
  • 现在很明显,用户正在添加类型和双重值。
  • double的参数名称现在为 value(比q更具描述性)。

现在,用户无法以未订单的参数(即add(5.0123, "someType"))调用该方法,因为这将导致编译器错误。如果不明显:更好的是要遇到编译器错误,因为它可以立即修复。这样,您就从头开始制作更安全的代码。

当然,这意味着您必须将double转换为string,但是在大多数情况下, ,给定上面概述的所有好处是一个很小的代价。

我不知道该值代表什么,但是您可以越接近它代表的"现实世界"实体,越好。

想想该方法应该做什么以及用户将如何称呼它。如果第二个参数是数字,则应使用适当的数字类型。通常,您应该以任何看起来更自然的方式编写代码。上面的链接帖子很棒,并且对此进行了更多细节。

至于您对什么"更快"的关注,您需要停止考虑这一点。这种微观的方法不太可能对性能产生可衡量的影响,而且它们并不是您作为新程序员所担心的。专注于正确代码。

这里有两个交流问题:

  1. 浮点类型floatdoublelong double也不能准确表示十进制数字,即使小数号只有几位数字。例如,将0.1表示为这些类型之一时,您将获得一个圆形值。标准库确保当您读取此值并再次写入时,您会恢复原始值(尾随零以外:0.1000可能会被格式化为0.1)。要格式化舍入错误并不是什么问题,但是当您开始算术时,小错误可能会导致有趣的问题。通过确切的表示,例如std::string,具有处理这些值的函数可以完成正确的事情的优势。
  2. 使用std::string代替数字值的问题存在一个问题,即接口未指示参数代表的内容,编译器无法使用类型检查来直接进行参数:实际类型隐藏在一个std::string。理想情况下,您将使用一个准确保留值的参数,同时也表示其语义。

根据您的需求,使用浮点类型或std::string可能是正确的选择:如果您想通过函数传递数字值,并且可以接受放松的尾随数字,那么最好使用一个浮点类型。如果您需要确切的算术并需要保留落后的派系零,则std::string可能是更好的选择。最好是,您将使用专用于十进制值正确表示的类型,但是(将来您希望能够使用std::decimal64,但不是标准的一部分)。