我正在尝试提取浮点值的整数和小数部分,而我似乎遇到了一些奇怪的舍入问题,可能是由于浮点数存储的不精确方式。
我有一些像这样的代码来提取小数部分:
double number = 2.01;
int frac = int(floor(number * 100)) % 100;
然而,这里的结果而不是1的结果为0.这似乎是因为原始的double实际存储为:
2.0099999...
然而,运行sprintf似乎可以获得正确的转换:
char num_string[99];
sprintf(num_string,"%f",number);
如果上述方法没有,sprintf如何得到正确答案?
答案 0 :(得分:2)
>然而,这里的结果而不是1作为一个结果。
你是什么意思?
... 2.099999
或者更像是 2.00999...
正如你所说:
int frac = int(floor(number * 100)) % 100;
将是:
int frac = int(floor(2.00999... * 100)) % 100;
= int(floor(200.999...)) % 100;
= int(floor(200.999...)) % 100;
= int(200) % 100;
= 200 % 100;
= 0;
您可能对this感兴趣。
另请参阅modf
的{{1}}:
math.h
modf()是一个比自己玩杂耍更好的选择。
答案 1 :(得分:1)
我同意dirkgently使用math.h中的modf。但如果你必须自己玩杂耍,试试这个代码吧。这应该解决你看到的问题。
int round(double a) {
if (a > 0)
return int(a + 0.5);
else
return int(a - 0.5);
}
int main()
{
double number = 2.01;
int frac = round((number - ((int)number)) * 100);
printf("%d", frac);
}