首页 > 解决方案 > 除非浮点数是完整的,否则是否有带有 sprintf 的格式字符串来填充?

问题描述

我希望用来sprintf格式化一些浮点值,但我似乎无法正确格式化。我已经尝试将“ %1.6f”作为格式字符串,但这不是我想要的。带有有效数字的“ g”说明符似乎也对我需要填充的其他情况没有帮助。

"1.6f"
Actual output: 1.000000
Expected Output: 1

"g"
Actual output: 1.1
Expected Output: 1.100000

标签: c++floating-pointformat-specifiers

解决方案


由于没有打印说明符来满足 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

推荐阅读