6

我需要将数字的小数部分转换为不带逗号的整数,例如我有 3.35 我只想得到不带零或逗号的 35 部分,

因为我使用 modf() 函数来提取小数部分,但如果有任何方法可以做到这一点或过滤“0”,它会给我一个 0.35。如果您向我展示如何使用更小的代码,我将非常感激,

4

8 回答 8

4

比转换为字符串并再次返回更有效:

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));
}
于 2012-10-09T13:40:18.143 回答
2
#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
}
于 2012-10-09T14:17:20.303 回答
0

另一种解决方案

int precision= 100;
double number = 3.35;
int f = floor(xx);
double temp = ( f - number ) * -1;
int fractional_part = temp * precision;
于 2012-10-09T13:35:15.400 回答
0

如果您需要它作为字符串,一个非常简单的 C 风格解决方案将是(应该适用于可变的小数位数):

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

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

于 2012-10-09T13:37:37.053 回答
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 的幂的数字来避免呼叫,或者使用查找表。

于 2012-10-09T13:49:30.923 回答
0

使用一些 stl 魔法,这里是示例代码:

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

它可以改进,但非常简单。

于 2012-10-09T13:55:06.133 回答
0

我刚刚做了一些接近你想要做的事情,虽然我还是很新。尽管如此,当我来到这里寻找我的问题的结果时,也许这将有助于将来的某人。

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

接下来,创建一个仅为整数的变量并将其值设置为等于双精度值。然后它将只包含整数。

然后从双精度数中减去整数 (int)。您将留下分数/小数值。从那里,只需乘以 100。

超过 100 个十进制值,您显然需要进行更多配置,但使用 if 语句应该相当简单。如果十进制值大于 .99,则乘以 1000,等等。

于 2016-03-04T08:21:15.813 回答
-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.
}

我很确定你可以只使用一个对象而不是两个不同istringstream的对象,但我不确定细节(从未使用过该类)所以我没有在示例中使用它。ostringstreamstringstream

于 2012-10-09T13:27:42.300 回答