在整数中获取double值的小数部分而不会丢失精度

时间:2013-06-23 09:21:48

标签: c double type-conversion precision floating

我想将double值的小数部分转换为精度,最多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 个答案:

答案 0 :(得分:4)

假设你想要得到一个正分数,即使是负值,我也会选择

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

应该会给你预期的结果1234

如果你不圆,只是截断值

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

(与原始代码基本相同),您将以双精度最终得到意外结果12331.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)

答案 1 :(得分:1)

数= 1.1234,整数= 1,分数= 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;
}

答案 2 :(得分: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;
}

答案 3 :(得分: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;
}