首页 > 解决方案 > 如何将任何大数字转换/截断为 C 中的前 3 位数字?

问题描述

例如:99999999 到 999、1382953292 到 138、12115454.54545 到 121、9856.12154848 到 985、

基本上,我想将一个大数字截断到它的前 3 位而不四舍五入。

输入为“双”。

标签: c

解决方案


我如何...将任何...数字截断为其前 3 位数字?

边缘情况很容易得到错误的答案。使用接近 10 次方的值进行测试double,并且略高于/低于将有助于摆脱较弱的解决方案。


转换为字符串可能会导致文本输出中的舍入,除非使用的精度足以防止 3 个 MS 数字的舍入。我建议从DBL_DECIMAL_DIG.

值 >= 1.0,没问题

char buf[1+1+1+DBL_DECIMAL_DIG+1+1+6      +1];
//       - d . ddzzzzzzzzzzzzz e - eeeeee \0

snprintf(buf, sizeof buf, "%+.*e", DBL_DECIMAL_DIG - 1, some_double);
// Set the least significant digits to 0
memset(buf + 5, DBL_DECIMAL_DIG - 3, '0');
printf("%s %.*e\n", buf, DBL_DECIMAL_DIG - 1, atof(buf));
// To just a 3 digit int
buf[2] = buf[3]; buf[3] = buf[4]; buf[4] = '\0';
printf("%s %d\n", buf, atoi(buf));

对于 < 1.0 和接近 10 次方的各种值,可能仍然存在一些问题。稍后将对此进行更多研究。


推荐阅读