c - 如何将任何大数字转换/截断为 C 中的前 3 位数字?
问题描述
例如:99999999 到 999、1382953292 到 138、12115454.54545 到 121、9856.12154848 到 985、
基本上,我想将一个大数字截断到它的前 3 位而不四舍五入。
输入为“双”。
解决方案
我如何...将任何...数字截断为其前 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 次方的各种值,可能仍然存在一些问题。稍后将对此进行更多研究。
推荐阅读
- ios - 斯威夫特用户界面。呈现从根视图推送的详细视图作为初始应用程序视图
- javascript - 如何优化nodejs中的mongodb查询?
- javascript - 使用 JS-Sparkline 绘制时间
- javascript - 如何在 Bootstrap modal 3 中正确显示 Google Map
- pandas - 美元符号 ($) 从 Seaborn FacetGrid 上的 Facet 中删除
- flutter - 用于获取 ssid 的连接插件“getWifiName()”方法在 ios 13+ 的颤振中返回 null
- javascript - 如何在文本图像周围绘制轮廓
- python - 在 Python 中处理没有 Scrapy/Selenium/Spynner 的无限滚动
- python - 如何在numpy数组中获取“对角线”以下元素的索引
- nginx - Nginx 代理 - proxy_set_header - 来自 site.conf 的自定义标头(用于 Varnish 缓存)