数字为std :: string或double
Number as a std::string or double?
我正在为HTTP客户端编写C 库。我在编程方面没有太多经验,所以请帮助我。
我的方法名为add
。它有两个参数。第一个是类型的名称,第二个是参数q。它是0到1< 0,1>之间的数字。DOT之后应该有0到4位数字。
我可以写它,但我不知道更好:
-
void add(std::string type, double q)
->我必须将Q转换为std :: string此方法的字符串。 -
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
,但是在大多数情况下, ,给定上面概述的所有好处是一个很小的代价。
我不知道该值代表什么,但是您可以越接近它代表的"现实世界"实体,越好。
想想该方法应该做什么以及用户将如何称呼它。如果第二个参数是数字,则应使用适当的数字类型。通常,您应该以任何看起来更自然的方式编写代码。上面的链接帖子很棒,并且对此进行了更多细节。
至于您对什么"更快"的关注,您需要停止考虑这一点。这种微观的方法不太可能对性能产生可衡量的影响,而且它们并不是您作为新程序员所担心的。专注于正确代码。
这里有两个交流问题:
- 浮点类型
float
,double
和long double
也不能准确表示十进制数字,即使小数号只有几位数字。例如,将0.1
表示为这些类型之一时,您将获得一个圆形值。标准库确保当您读取此值并再次写入时,您会恢复原始值(尾随零以外:0.1000
可能会被格式化为0.1
)。要格式化舍入错误并不是什么问题,但是当您开始算术时,小错误可能会导致有趣的问题。通过确切的表示,例如std::string
,具有处理这些值的函数可以完成正确的事情的优势。 - 使用
std::string
代替数字值的问题存在一个问题,即接口未指示参数代表的内容,编译器无法使用类型检查来直接进行参数:实际类型隐藏在一个std::string
。理想情况下,您将使用一个准确保留值的参数,同时也表示其语义。
根据您的需求,使用浮点类型或std::string
可能是正确的选择:如果您想通过函数传递数字值,并且可以接受放松的尾随数字,那么最好使用一个浮点类型。如果您需要确切的算术并需要保留落后的派系零,则std::string
可能是更好的选择。最好是,您将使用专用于十进制值正确表示的类型,但是(将来您希望能够使用std::decimal64
,但不是标准的一部分)。
- C++ 模板函数无法将"std:string"转换为"double"作为回报
- 使用词法强制转换在'string to double'中设置双精度变量的精度
- 如何在类/类型中添加更多函数来构建 int、double、std::string 等
- "double(*)(string, double, double)"尝试传递函数C++时"double"转换错误
- 使用Boost Karma替换STD :: stringstream double到STD :: String Conv
- 无法获得 boost::spirit parser&lexer 适用于 std::string 或 int 或 double 以外的令牌类型
- 数字为std :: string或double
- C ++多个CIN默认值(如果未输入),则添加到map<string,vector<double>>
- 将矢量<std::string>转换为矢量<double>
- 从矢量<string>转换为<double>不带 std::stod 的矢量
- c++在不使用char数组的情况下将std::string转换为int、double等
- c++中从double/int/string到bool的自动转换
- 从文件中读取数据类型string, int double.将每一行数据放入对象向量中
- c-string和(int,double,float)之间的动态分配
- c++验证String中的Double类型
- 将double/float类型转换为string类型,保留科学记数法和精度
- 一个如何实现string和long, int, double模板函数的建议
- 将矢量<string>转换为矢量<double>C++错误
- 将矢量<string>转换为矢量<double>的便捷方法
- 从double到string到double的转换会引发异常