在 C 中使用 fmod() 总是导致零 (0)

Using fmod() in C always results in zero (0)

我正在尝试将 16 位数字拆分成数字。使用 unsigned long int% 不起作用,因为这种类型的变量只支持小于 4.294.967.295 的数字。所以我调整了代码并使用 fmod 而不是 %,但现在我得到的唯一结果是零。

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <math.h>

int main() {
    setlocale(LC_ALL, "");

    double num, digit;
    int i;

    printf("Enter the 16-digit number: ");
    scanf("%lf", &num);

    for (i = 1; num > 0; i++) {
        printf("%d - ", i);
        digit = fmod(num, 10.0);
        printf("%.2lf   ", digit);

        num /= 10.0;
        printf("%.2f\n", num);
    }
}

我做错了什么?

fmod 不是处理大整数的正确工具,如果您希望拥有精确数字,则 double 类型也不是。对于 1016 这样大的数字,类型 unsigned long int 可能确实不够大,具体取决于目标体系结构,尤其是 long 类型只有 32 个的遗留系统即使在 64 位模式下也是如此。

您应该使用 unsigned long long int 类型,它保证至少有 64 个值位,对于您的大整数来说绰绰有余:

#include <stdio.h>
#include <stdlib.h>

int main() {
    unsigned long long num;
    int i, digit;

    printf("Enter the 16-digit number: ");
    if (scanf("%llu", &num) == 1) {
        for (i = 1; num > 0; i++) {
            printf("%d - ", i);
            digit = num % 10;
            printf("%d   ", digit);
            num /= 10;
            printf("%llu\n", num);
        }
    }
    return 0;
}