3

我想将精度高达 4 位的双精度值的小数部分转换为整数。但是当我这样做时,我会失去精度。有什么办法可以让我得到精确的值吗?

#include<stdio.h>
int main()
{
    double number;
    double fractional_part;
    int output;
    number = 1.1234;
    fractional_part = number-(int)number;
    fractional_part = fractional_part*10000.0;
    printf("%lf\n",fractional_part);
    output = (int)fractional_part;
    printf("%d\n",output);
    return 0;
}

我期望输出为 1234,但它给出了 1233。请提出一种方法,以便我可以获得所需的输出。我想要C语言的解决方案。

4

4 回答 4

4

假设即使对于负值,您也想获得正分数,我会选择

(int)round(fabs(value - trunc(value)) * 1e4)

这应该会给你预期的结果1234

如果您不四舍五入并截断该值

(int)(fabs(value - trunc(value)) * 1e4)

(这与您的原始代码基本相同),您最终会得到意外的结果1233,如1.1234 - 1.0 = 0.12339999999999995双精度。

如果不使用round(),如果将操作顺序更改为

(int)(fabs(value * 1e4 - trunc(value) * 1e4))

如果 的积分部分value足够大,浮点不准确当然会再次出现。

您也可以使用modf()而不是trunc()大卫建议的那样,就浮点精度而言,这可能是最好的方法:

double dummy;
(int)round(fabs(modf(value, &dummy)) * 1e4)
于 2013-06-23T09:58:46.617 回答
1

number= 1.1234, whole=1, fraction=1234

int main()
{
 double number;
 int whole, fraction;
 number = 1.1234;
 whole= (int)number;
 fraction =(int)(number*10000);
 fraction = fraction-(whole *10000);
 printf("%d\n",fraction);
 printf("%d\n",whole);
 return 0;
}
于 2013-09-01T19:16:39.583 回答
1

任何数字的解决方案可能是:

#include <cmath>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{ 
float number = 123.46244;
float number_final;
float temp = number;  // keep the number in a temporary variable
int temp2 = 1;        // keep the length of the fractional part

while (fmod(temp, 10) !=0)   // find the length of the fractional part
{
    temp = temp*10;
    temp2 *= 10;
}

temp /= 10;       // in tins step our number is lile this xxxx0
temp2 /= 10;
number_final = fmod(temp, temp2);

cout<<number_final;

getch();
return 0;
}
于 2013-11-27T09:25:32.113 回答
0

使用modf和 ceil

#include <stdio.h>
#include <math.h>

int main(void)
{
    double param, fractpart, intpart;
    int output;

    param = 1.1234;
    fractpart = modf(param , &intpart);
    output = (int)(ceil(fractpart * 10000));
    printf("%d\n", output);

    return 0;
}
于 2013-06-23T09:36:22.513 回答