我需要一个数的小数部分转换成整数没有逗号, ,比如我有3.35我要得到的只是35部分无零或逗号,C++数字的小数部分转换成整数
因为我使用了modf()函数来提取小数部分,但是如果有任何方法可以做到这一点或过滤'0',它会给我一个0.35 。部分我将非常感激,如果你告诉我如何使用较小的代码,
我需要一个数的小数部分转换成整数没有逗号, ,比如我有3.35我要得到的只是35部分无零或逗号,C++数字的小数部分转换成整数
因为我使用了modf()函数来提取小数部分,但是如果有任何方法可以做到这一点或过滤'0',它会给我一个0.35 。部分我将非常感激,如果你告诉我如何使用较小的代码,
以下是我将如何做到这一点。
#include <sstream>
#include <string>
int main()
{
double d = yourDesiredNumber; //this is your number
std::ostringstream out;
out << setprecision(yourDesiredPrecision) << std::fixed
<< std::showpoint << d;
std::istringstream in(out.str());
std::string wholePart; //you won't need this.
int fractionalPart;
std::getline(in, wholePart, '.');
in >> fractionalPart;
//now fractionalPart contains your desired value.
}
我敢肯定,而不是两个不同的istringstream
和ostringstream
对象,你可能只用一个stringstream
对象侥幸,但我不知道的细节(从未使用过类),所以我没”在示例中使用它。
我不会这样做。这是缓慢和有损... –
@ RichardJ.RossIII:我诚实地等待你发表一个答案,看看你*会做什么。 –
这让我想起以下引用 - http://bash.org/?946461 – 2012-10-09 13:52:32
另一种解决方案
int precision= 100;
double number = 3.35;
int f = floor(xx);
double temp = (f - number) * -1;
int fractional_part = temp * precision;
'数字 - f'而不是'(f - 数字)* -1'怎么样? –
对于负数,这不起作用。 -0.1给出90 – digitalvision
如果你需要它作为一个字符串,一个很简单的空调风格的解决办法是(应该适用于小数的变量数):
double yourNumber = 0.35f;
char buffer[32];
snprintf(buffer, 32, "%g", yourNumber);
strtok(buffer, "."); // Here we would get the part before . , should still check
char* fraction = strtok(NULL, ".");
int fractionAsInt = atoi(fraction);
这个例子缺乏在字符串错误的情况下进行错误处理,如果您只需要固定的小数位数,则不可行,因为算术方法在那里工作得更好。
比转换成字符串,然后再返回位更高效:
int fractional_part_as_int(double number, int number_of_decimal_places) {
double dummy;
double frac = modf(number,&dummy);
return round(frac*pow(10,number_of_decimal_places));
}
像这样的东西应该工作:通过使用户
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
static int get_frac(double value, unsigned short precision)
{
return (int)((value - (long)value) * pow(10, precision));
}
static int get_frac_no_trailing_zeros(double value, unsigned short precision)
{
int v = get_frac(value, precision);
while (v % 10 == 0)
v /= 10;
return v;
}
int main(int argc, char *argv[])
{
double v;
v = 123.4564;
printf("%.4f = %d\n", v, get_frac(v, 2));
printf("%.4f = %d\n", v, get_frac(v, 4));
printf("%.4f = %d\n", v, get_frac(v, 6));
printf("%.4f = %d\n", v, get_frac_no_trailing_zeros(v, 6));
return EXIT_SUCCESS;
}
你也可以想要么避免调用pow
首先提供10的幂数,或使用查找表。
使用一些魔法STL,here is示例代码:
typedef std::pair<int, int> SplitFloat;
SplitFloat Split(float value, int precision)
{
// Get integer part.
float left = std::floor(value);
// Get decimal part.
float right = (value - left) * float(std::pow(10, precision));
return SplitFloat(left, right);
}
可以改善,但是是非常简单的。
#include <iostream>
#include <cmath>
double round(double r) {
return (r > 0.0) ? std::floor(r + 0.5) : std::ceil(r - 0.5);
}
double floor_to_zero(double f) {
return (f > 0.0) ? std::floor(f) : std::ceil(f);
}
double sign(double s) {
return (s < 0.0) ? -1.0 : 1.0;
}
int frac(double f, int prec) {
return round((f - floor_to_zero(f)) * prec) * sign(f);
}
int main() {
double a = 1.2345;
double b = -34.567;
std::cout << frac(a, 100) << " " << frac(b, 100) << std::endl; // 23 57
}
我只是做了一些接近你想要做的事情,虽然我还是很新的。无论如何,也许这将有助于未来的人,因为我登陆这里寻找我的问题的结果。
第一步是确保包含3.35的变量是双精度,但这可能很明显。
接下来,创建一个只有整数的变量,并将其值设置为double的值。它将只包含整个数字。
然后从double中减去整数(int)。您将剩下分数/十进制值。从那里开始,乘以100.
超过100ths的十进制值,你将不得不做更多的配置显然,但它应该是一个相当简单的做一个if语句。如果十进制值大于.99,则乘以1000等。
总是只有两位小数?如何乘以100并转换为整数? –
将其格式化为一个字符串,然后将小数点后面的所有内容都复制出来,或删除一切直到第一个数字字符。 (那么你可以将它转换回int,如果这就是你所要求的) – Mordachai
3.35的二进制表示很可能是'3.349999986f'左右。 3.350的二进制表示是相同的。考虑到两个输入3.35和3.350,你期望的输出是什么? – MSalters