10

サンプルコード:

int main() {
  float f = 123.542;
  int i = (int)f;
  printf("%d\n",i);
}
4

6 に答える 6

10

123.3443 は浮動小数点数で正確に表すことはできません。32 ビット浮動小数点数では、事実上 として表され16166984 / 131072ます。これは、実際には 123.34429931640625 であり、123.3443 ではありません。(約 6.8 x 10^-7 ずれています。)

これが本当にあなたが望む結果である場合 (おそらくそうではないかもしれません)、IEEE-754 float がどのように機能するかを見て、お気に入りの任意精度の数学スイートを引き出してください。「舞台裏」で何が起こっているかを理解すれば、正確な表現を生成することはそれほど難しくありません。「十分に近い」丸みを帯びた表現を生成することは、実際にははるかに困難です。:)

于 2012-03-10T06:24:59.463 に答える
2
int i = (int) (f * 10000 + 0.5);
于 2012-03-10T06:07:00.260 に答える
0

を乗算し、float必要10^xx小数点以下の桁数を にキャストしてから にキャストしintます。

于 2012-03-10T06:07:27.357 に答える
0

変換された数値を繰り返し処理する必要がなく、数値を整数に変換するだけの場合、最も簡単な方法は sprintf を使用し、10 の累乗規則を使用して for ループで小数を合計することです。数学に「正確な精度」が必要な場合は、BCD を使用してください。次のアルゴリズムを使用すると、「正確な精度」のために桁数を切り捨てることができます。

#include "math.h"

long ConvertToScaledInteger (float value, int significantDigits = -1)
{
    // Note: for 32-bit float, use long return and for double use long long.

    if (significantDigits < 1)   // Ditch the '-' and the '.'
        significantDigits += 2;
    else
        ++significantDigits;     // Ditch the '.'

    char* floatingPointString = malloc(sizeof (char) * (4 + FLT_MANT_DIG - FLT_MIN_EXP));
    /*< This solution  is for a 32-bit floating point number. Replace FLT 
         with DBL, and it will produce the max number of chars in a 64-bit 
         float string. */

    if (significantDigits < 0)   //< Then use all of the float's digits.
    {
        sprintf (floatingPointString , "%f", floatingPointNumber);
    }
    else    //< Then truncate the number of decimal places.
    {
        char decimalPlaceString[9];
        char percentString = "%\0";
        sprintf (decimalPlaceString, "%s%if", percentString , significantDigits);
        sprintf (floatingPointString , decimalPlaceString, value);
    }

    int stringLength = strlen (floatingPointString),
        index;
    long returnValue = 0;
    double powerOfTen = 10.0,
        currentValue;

    // Find if we have an ending of .0, and backtrack.
    if (floatingPointString[stringLength - 1] == '0' && floatingPointString[stringLength - 2] == '.')
        index = stringLength - 3;
    else
        index = stringLength - 1;

    for (; index > 0; --index)
    {
        if (floatingPointString[index] == '.')
            --index;

        // Subtract ASCII '0' converts ASCII to integer.

        currentValue = (double) floatingPointString[index] - '0';
        returnValue += (long) currentValue * pow (10.0, powerOfTen);

        powerOfTen += 1.0;
    }

    if (floatingPointString[0] == '-')
        returnValue *= -1;

    return returnValue;
}
于 2015-09-22T10:58:34.910 に答える
-1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int f2i(float v, int size, int fsize){
    char *buff, *p;
    int ret;
    buff = malloc(sizeof(char)*(size + 2));
    sprintf(buff, "%*.*f", size, fsize, v);
    p = strchr(buff, '.');
    while(*p=*(p+1))p++;
    ret = atoi(buff);
    free(buff);
    return ret;
}

int main(){
    float f = 123.3443;

    printf("%d\n", f2i(f, 7, 4));

    f=123.542;
    printf("%d\n", f2i(f, 6, 3));
    return 0;
}
于 2012-03-10T11:15:33.927 に答える