10

示例代码:

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

6 回答 6

10

123.3443 不能用浮点数精确表示——在 32 位浮点数中,它实际上表示为16166984 / 131072123.34429931640625,而不是 123.3443。(大约 6.8 x 10^-7。)

如果这确实是您想要的结果(可能不是),请查看 IEEE-754 浮点数是如何工作的,并拿出您最喜欢的任意精度数学套件。一旦您了解“幕后”发生的事情,生成精确的表示应该不会太难。生成“足够接近”的舍入表示实际上要困难得多。:)

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

乘以你想要float的小数点后的位数,然后转换10^x为。xint

于 2012-03-10T06:07:27.357 回答
0

float一个数字的整数等价物f

float f=123.456;

可以使用modff()like

float integral, fractional;
char str[50], temp[20];
fractional = modff(f, &integral);

现在integral有整数部分(如 123.000000)和fractional小数部分(如 0.456000)。

如果浮点数(f在这种情况下)为负数,则两者均为integral负数fractional

你可以做

if(fractional<0)
{
    fractional = -fractional;
}

来补救。

现在,

sprintf(temp, "%g", fractional);

格式说明符将%g删除尾随零,temp现在将具有"0.456".

sprintf(str, "%g%s", integral, temp[1]=='.'?temp+2:"");

之所以temp[1]=='.'?这样做,是因为如果小数部分是0,那么在打印时将没有小数点,fractional因为它本来应该是0而不是0.000000。如果第二个字符tempis not .,fractional为零,我们就不必费心了。

现在在我们的例子中,str将是"123456". 但这是字符串的形式。我们需要将其转换为整数。为此使用strtol()

long l=strtol(str, NULL, 10);
if(l>INT_MAX || errno==ERANGE)
{
    printf("\noverflow");
}
else
{
    printf("\n%d", strtol(str, NULL, 10));
}

strtol()您可以检查 的和的返回值errno(从errno.h。检查是否是ERANGE),看看是否发生溢出。

要查看结果值是否可以存储在 a 中int,首先将 a 返回的值存储strtol()在 a 中long int,然后查看它是否大于INT_MAX(它在 中limits.h)。

应该注意,结果的准确性将取决于浮点数以二进制表示的准确性。

于 2017-10-20T13:38:33.040 回答
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 回答