我对C语言比较陌生,当我执行下面的代码时,输出的值是12098而不是12099。
我知道处理小数总会涉及到一定程度的不准确性,但是否有一种方法可以每次精确地将小数点向右移动两位?
#include <stdio.h>
int main(void)
{
int i;
float f = 120.99;
i = f * 100;
printf("%d", i);
}
使用round
函数
float f = 120.99;
int i = round( f * 100.0 );
double d = 100000000000000.99;
uint64_t j = round( d * 100.0 );
printf( "%llu\n", j );
这只是一个例子,找到超过 double
精度的最小数字留给读者作为练习。
在整数上使用定点算术:
#include <stdio.h>
#define abs(x) ((x)<0 ? -(x) : (x))
int main(void)
{
int d = 12099;
int i = d * 100;
printf("%d.%02d\n", d/100, abs(d)%100);
printf("%d.%02d\n", i/100, abs(i)%100);
}
i = (f * 100) + 0.5
i = (f * 100) - 0.5
...您可以使用
float f = 120.99f
或者
double f = 120.99
默认情况下,C将浮点值存储为双精度,因此如果您将它们存储在浮点变量中,则会发生隐式转换,这是不好的...
我认为这可以解决。
double
值存储在float
变量中时,不会发生强制转换,而是发生隐式转换。 - The Paramagnetic Croissant
float i, f = 120.99f;
。 - haccksftoa()
并将每个数字复制到一个char
缓冲区中,通过isdigit()
跳过小数点字符。 - Alex Reynoldsi = f * 100 + 0.5f
可以避免在数字如120.99
中出现问题。它会四舍五入到最近的整数(但对于负值,请使用-0.5f
)。 - JS1