获取存储为字符串的数字的小数部分

Getting the decimal part of a number stored as string

本文关键字:数字 小数部 字符串 存储 获取      更新时间:2023-10-16

我当前制作的程序需要我存储大型浮点数。我正在将它们存储为字符串,这很好(当然,我不得不超载一些我需要的操作员)(我不允许使用任何多精制算术库)。现在,我正在寻找一种获取数字小数部分的方法,并将其存储为字符串。我考虑过使用Stringstream和忽略,但这似乎不起作用。我的代码中有什么问题,因为这无能为力?或者还有其他方法可以实现它(我还在考虑一个循环,该循环会迭代通过流,直到点,该循环会起作用吗?)

string toDecimal(string x)
{
string decimalValue;
stringstream x2(x);
x2 >> x;
x2.ignore(100, '.'); //it can have up to 100 places before the dot
decimalValue = x2.str();
cout << decimalValue << end;
return decimalValue;
}

我要实现的目标是:

 18432184831754814758755551223184764301982441

由此:

 18432184831754814758755551223184764301982441.4321432154

您也可以使用c++std::string类来完成此操作。以下代码说明了如何实现。

std::string toDecimal(std::string x)
{
    return s.substr(0, s.find("."));
}

您的方法是完全有效的(我知道您的方法是删除字符串的分数部分,但这不是您的代码所做的)。在复杂性的热量中,我认为不会添加太多,因为如果不进行线性扫描,您无法神奇地发现点的位置。这意味着您的想法就算法本身就足够好了。我认为MSRD0的答案在执行方面将更有效,因为它使用了低级别的纯C实现。但是我认为伊曼纽尔的答案是最好的答案,因为它更容易维护。但是,如果您坚持使用与尝试执行的操作或相似的事情,如果您确实需要使用stringstream ,那么我有这个工作版本的代码。

#include <string>
#include <iostream>
#include <sstream>
#include <algorithm>
std::string toDecimal(std::string x){
    std::string decimalValue;
    std::reverse(x.begin(), x.end());
    std::stringstream x2(x);
    x2.ignore(100, '.'); 
    x2 >> decimalValue;
    std::reverse(decimalValue.begin(), decimalValue.end());
    std::cout << decimalValue << std::endl;
    return decimalValue;
}

ps:此代码假设您确实在字符串内有一个点。

无需使用Fancy stringstream或其他任何东西,您就可以简单地使用:

char *x = "18432184831754814758755551223184764301982441.4321432154";
char *p = x;
while (*p != '.' && *p != 0)
    p++;
*p = 0;
// now x holds the string until the .