从字符串中以指数表示法解析整数
Posted
技术标签:
【中文标题】从字符串中以指数表示法解析整数【英文标题】:parsing integer in exponential notation from string 【发布时间】:2013-07-02 09:42:20 【问题描述】:显然std::stoi
不接受以指数表示法表示整数的字符串,例如"1e3"
(= 1000)。有没有一种简单的方法可以将这样的字符串解析为整数?有人会认为,由于这种表示法在 C++ 源代码中有效,标准库有一种方法来解析它。
【问题讨论】:
【参考方案1】:您可以使用stod
(参见docs)来执行此操作,首先将其解析为双精度。 在回退时要注意精度问题...
#include <iostream> // std::cout
#include <string> // std::string, std::stod
int main ()
std::string text ("1e3");
std::string::size_type sz; // alias of size_t
double result = std::stod(text,&sz);
std::cout << "The result is " << (int)result << std::endl; // outputs 1000
return 0;
【讨论】:
+1 但如果结果的幅度太大,则保留 (int)result 为 UB。 是的,我应该强调这一点。【参考方案2】:有人会认为,由于这种表示法在 C++ 源代码中有效,标准库有办法解析它。
库和编译器无关。此语法在 C++ 中有效的原因是该语言允许您将 double
类型的表达式分配给整数变量:
int n = 1E3;
将double
表达式(即double
类型的数字文字)分配给整数变量。
知道这里发生了什么,您应该能够轻松识别标准 C++ 库中满足您需要的函数。
【讨论】:
【参考方案3】:例如,您可以使用标准流将其读取为双精度
double d;
std::cin >> d; //will read scientific notation properly
然后将其转换为 int,但显然 double 可以表示比 int 更多的值,所以要小心。
【讨论】:
【参考方案4】:将指数符号发送到std::stoi
会经常溢出,而 C++ 中的整数溢出是未定义的行为。
您需要自己构建,以便根据您的特定要求定制边缘案例。
我倾向于不走std::stod
路线,因为如果double
的组成部分不能由int
表示,则从double
到int
的转换是未定义的行为。
【讨论】:
以上是关于从字符串中以指数表示法解析整数的主要内容,如果未能解决你的问题,请参考以下文章