获取存储为字符串的数字的小数部分
Getting the decimal part of a number stored as string
我当前制作的程序需要我存储大型浮点数。我正在将它们存储为字符串,这很好(当然,我不得不超载一些我需要的操作员)(我不允许使用任何多精制算术库)。现在,我正在寻找一种获取数字小数部分的方法,并将其存储为字符串。我考虑过使用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 .
相关文章:
- 获取数字小数部分的最佳方法
- C 如何在小数系统中添加两个数字
- 如何设置数字格式以显示C 中的所有小数位数
- 如何解析小数分离器为结肠的数字的字符串表示:
- 获取存储为字符串的数字的小数部分
- 将十进制数字截断为最接近的4个小数和断言
- C++不显示小数位数的数字
- C++ 将数字的小数部分转换为整数
- 显示带小数位数的数字,而不是整数
- 你如何在数字上添加 2 位小数
- 在小数秒内仅用 3 位数字格式化 posix 时间
- 如何从 9 和 90 中提取 2.9 和 2.09,即获取数字等于最大编号的小数部分.二分位数之后的数字
- 两个数字相减时的小数
- 如何在C++中存储数字而不截断小数
- 使用'int'数据类型时出错,即使数字不是小数
- 用两个小数求3个数字的平均值(不舍入!)
- 如何在c++中存储纬度的小数部分为4 unsigned char
- 为什么小数后面的数字都是零
- 由正整数或正小数组成的字符串,转换为I数字格式
- 丢弃部分行并保存任意长的数字