在 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;
}
我正在尝试将 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;
}