我想将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语言编写解决方案。
答案 0 :(得分: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)
答案 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;
}