【问题标题】:Format double with at least one decimal in printf在 printf 中使用至少一位小数格式化双精度
【发布时间】:2016-06-03 09:37:18
【问题描述】:

我们使用%.15g 为JSON 格式化一个具有最大精度但没有尾随零的双精度。然而,为了区分整数和实数,我们希望使用至少一位数字来格式化双精度数,即 "%.1f",但科学计数法中的数字除外(根据定义是双精度数)。

有没有办法在单个 snprint format 中实现这一点?

double val;
char buf[32];

if(fabs(val) < 1e15 && !fmod(val, 1)){
  // whole numbers get at least one decimal
  snprintf(buf, 32, "%.1f", val);
} else {
  // automatically detemines decimal or scientific notation
  snprintf(buf, 32, "%.15g", val);
}

【问题讨论】:

  • 使用15 形成“最大精度”是正确的假设。

标签: c json formatting printf


【解决方案1】:

如果字符串只包含符号和数字字符,只需使用转换说明符g,并在字符串末尾添加.0yajl 库有一个 example implementation:

char buf[32];
sprintf(buf, "%.20g", val);
if (strspn(buf, "0123456789-") == strlen(buf)) {
  strcat(buf, ".0");
}

【讨论】:

  • 这是正确答案。使用fmod 是不可靠的,因为val 可能不是整数,但由于四舍五入而打印为整数,例如1.0000000000001 当我们将 json 数字限制为 8 位时。
猜你喜欢
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多