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

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

文字列として必要な場合、非常に簡単な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

別の解決策

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

このようなものが動作するはずです:

#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

私はまだかなり新しいですが、あなたがやろうとしていることに近いことをしただけです。それにもかかわらず、私がここに着陸して私の問題の結果を探しているので、これは将来誰かを助けるかもしれません.

最初のステップは、3.35 を含む変数が double であることを確認することですが、それはおそらく明らかです。

次に、整数のみの変数を作成し、その値を double の値と等しくなるように設定します。その場合、整数のみが含まれます。

次に、double から整数 (int) を引きます。分数/小数の値が残ります。そこから、100を掛けるだけです。

100 分の 1 の値を超えると、明らかにもう少し構成を行う必要がありますが、if ステートメントを使用するのはかなり簡単なはずです。10 進数の値が .99 より大きい場合は、代わりに 1000 を掛けます。

于 2016-03-04T08:21:15.813 に答える