格式化double,printf中至少有一个小数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了格式化double,printf中至少有一个小数相关的知识,希望对你有一定的参考价值。

要为具有最大精度但没有尾随零的JSON格式化double,我们使用%.15g。然而,为了区分整数和实数,我们希望用至少一个数字格式化双精度数,即"%.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);
}
答案

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

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

以上是关于格式化double,printf中至少有一个小数的主要内容,如果未能解决你的问题,请参考以下文章

C语言中double要输出几位小数?

double数据控制保留小数的几种方法

c语言如何控制小数位数

c语言如何控制小数位数?

整型和浮点型相减的问题

查找文本文件中至少有两个共同单词的所有行(Bash)