从字符串中解析指数表示法中的整数

parsing integer in exponential notation from string

本文关键字:表示 整数 字符串 指数      更新时间:2023-10-16

显然,std::stoi不接受用指数表示整数的字符串,比如"1e3"(=1000)。有没有一种简单的方法可以将这样的字符串解析为整数?人们可能会认为,由于这种表示法在C++源代码中有效,因此标准库有一种解析方法。

您可以使用stod(请参阅文档),首先将其解析为双精度不过在回投时要注意精度问题

#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;
 }

人们可能会认为,由于这种表示法在C++源代码中有效,因此标准库有一种解析方法。

库和编译器是不相关的。这种语法在C++中起作用的原因是,该语言允许您将类型为double的表达式分配给整数变量:

int n = 1E3;

double表达式(即类型为double的数字文字)分配给整数变量。

知道这里发生了什么,你应该能够很容易地在标准C++库中识别出你需要的函数。

您可以使用标准流(例如)将其读取为双精度

double d;
std::cin >> d; //will read scientific notation properly

然后将其强制转换为int,但显然double可以表示比int多得多的值,所以要小心。

std::stoi中发出指数表示法会经常溢出,C++中的整数溢出是未定义的行为。

你需要建立你自己的,你可以泰勒的边缘情况,以满足你的具体要求。

我倾向于不走std::stod路线,因为如果double的整体部分不能用int表示,从doubleint的转换是未定义的行为。