这个呢? fmod 应该返回指定小数位数之后的小数,所以我们可以比较这两个数字,看看它们是否相等。
int needsD1Decimals(float N, int D1, int D2) {
float pow1 = pow(0.1f, D1); // 0.0001
float pow2 = pow(0.1f, D2); // 0.01
float mod1 = fmod(N, pow1); // 0.00001
float mod2 = fmod(N, pow2); // 0.00001
if (fabs(mod1 - mod2) > (pow1 / 2)) { // > 0.00005 to handle errors
return 1;
}
return 0;
}
如果您只是想打印出正确的答案,那么只打印最多小数位并在末尾截断零可能会更快:
void printNumber(float N, int D1, int D2) {
char format[256];
char result[256];
sprintf(format, "%%.%df", D1);
sprintf(result, format, N);
char *end = result + strlen(result) - 1;
int zeros = 0;
while (end > result && end[0] == '0' && zeros < (D1 - D2))
{
zeros++;
end--;
}
if (zeros >= (D1 - D2))
{
end[1] = '\0';
}
puts(result);
}
void doNumber(float N, int D1, int D2) {
printf("%f, %d, %d: ", N, D1, D2);
printNumber(N, D1, D2);
printf("\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
doNumber(0.01001f, 4, 2);
doNumber(0.010101f, 4, 2);
doNumber(0.011001f, 4, 2);
doNumber(5000.0f, 4, 2);
return 0;
}