c++ - 除非浮点数是完整的,否则是否有带有 sprintf 的格式字符串来填充?
问题描述
我希望用来sprintf
格式化一些浮点值,但我似乎无法正确格式化。我已经尝试将“ %1.6f
”作为格式字符串,但这不是我想要的。带有有效数字的“ g
”说明符似乎也对我需要填充的其他情况没有帮助。
"1.6f"
Actual output: 1.000000
Expected Output: 1
"g"
Actual output: 1.1
Expected Output: 1.100000
解决方案
由于没有打印说明符来满足 OP 的详细需求("%g"
接近),因此需要进行一些测试。
为了满足“除非浮点数是完整的”,测试值是否是完整的modf()
(或modff()
在 C 中为float
)。该函数返回小数部分。
// Illustrative code with printf vs sprintf
void mzkoops56_print(float x) {
float ipart;
if (modf(x, &ipart) == 0.0) {
printf("%.0f\n", x);
} else {
printf("%.6f\n", x);
}
}
这将打印非整数值,例如 0.999996、1.0000004,它们接近带有小数的整数值。
mzkoops56_print(nextafterf(1.0,0));
mzkoops56_print(1.0);
mzkoops56_print(nextafterf(1.0,2));
mzkoops56_print(1.1f);
1.000000
1
1.000000
1.100000
推荐阅读
- ios - SwiftUI 缩放映射到 POI 列表
- android - AOSP Build 的 Walleye Boot.img 不会让我 adb sideload
- deep-learning - 我们可以在与使用计算机视觉检测到的道路车道的特定距离处绘制一条平行线吗?
- python - 按类别替换频率较低的标签
- python - 为什么在 github 操作中使用 pipenv 时将 python 3.7 替换为 python 3.8?
- ruby-on-rails - 有没有办法将从 Google Slides API 接收到的 JSON 数据转换回原始演示文稿?
- c# - 并行执行多个长时间运行的任务
- llvm - “选择重新组合”LLVM 6.0 的预期类型错误
- java - 具有复杂条件驱逐的缓存
- filter - api-platform:对嵌入对象的集合进行过滤不起作用