2012-10-09 205 views
5

我需要一个数的小数部分转换成整数没有逗号, ,比如我有3.35我要得到的只是35部分无零或逗号,C++数字的小数部分转换成整数

因为我使用了modf()函数来提取小数部分,但是如果有任何方法可以做到这一点或过滤'0',它会给我一个0.35 。部分我将非常感激,如果你告诉我如何使用较小的代码,

+8

总是只有两位小数?如何乘以100并转换为整数? –

+2

将其格式化为一个字符串,然后将小数点后面的所有内容都复制出来,或删除一切直到第一个数字字符。 (那么你可以将它转换回int,如果这就是你所要求的) – Mordachai

+0

3.35的二进制表示很可能是'3.349999986f'左右。 3.350的二进制表示是相同的。考虑到两个输入3.35和3.350,你期望的输出是什么? – MSalters

回答

-1

以下是我将如何做到这一点。

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

我敢肯定,而不是两个不同的istringstreamostringstream对象,你可能只用一个stringstream对象侥幸,但我不知道的细节(从未使用过类),所以我没”在示例中使用它。

+2

我不会这样做。这是缓慢和有损... –

+1

@ RichardJ.RossIII:我诚实地等待你发表一个答案,看看你*会做什么。 –

+0

这让我想起以下引用 - http://bash.org/?946461 – 2012-10-09 13:52:32

0

另一种解决方案

int precision= 100; 
double number = 3.35; 
int f = floor(xx); 
double temp = (f - number) * -1; 
int fractional_part = temp * precision; 
+1

'数字 - f'而不是'(f - 数字)* -1'怎么样? –

+2

对于负数,这不起作用。 -0.1给出90 – digitalvision

0

如果你需要它作为一个字符串,一个很简单的空调风格的解决办法是(应该适用于小数的变量数):

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); 

这个例子缺乏在字符串错误的情况下进行错误处理,如果您只需要固定的小数位数,则不可行,因为算术方法在那里工作得更好。

3

比转换成字符串,然后再返回位更高效:

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)); 
} 
0

像这样的东西应该工作:通过使用户

#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的幂数,或使用查找表。

0

使用一些魔法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); 
} 

可以改善,但是是非常简单的。

1
#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 
} 
0

我只是做了一些接近你想要做的事情,虽然我还是很新的。无论如何,也许这将有助于未来的人,因为我登陆这里寻找我的问题的结果。

第一步是确保包含3.35的变量是双精度,但这可能很明显。

接下来,创建一个只有整数的变量,并将其值设置为double的值。它将只包含整个数字。

然后从double中减去整数(int)。您将剩下分数/十进制值。从那里开始,乘以100.

超过100ths的十进制值,你将不得不做更多的配置显然,但它应该是一个相当简单的做一个if语句。如果十进制值大于.99,则乘以1000等。