【问题标题】:Why printf with %.2g doesn't show two digits after the dot?为什么带有 %.2g 的 printf 在点后不显示两位数?
【发布时间】:2021-04-09 09:19:09
【问题描述】:
#include <stdio.h>

int main()
{
    printf("%.2g %.2f\n", 2.925, 2.925);
}

我认为正确的输出应该是:

2.93 2.93

现在,输出如下:

2.9 2.92

有两个误解:

  1. 为什么 '%.2g' 不显示点后面的两位数?

  2. 为什么要四舍五入?

【问题讨论】:

  • 2.9252.92499999999999982236431605997495353221893310546875 精确。所以四舍五入是正确的。
  • 第一个呢?

标签: c floating-point printf


【解决方案1】:

1。为什么会有不同的位数?

printf 转换规范中的精度字段对于 fg 转换是不同的。来自标准(C17 草案,7.21.6 格式化输入/输出函数):

  • 一个可选的precision,给出d、i、o、u、x和X转换出现的最小位数,小数点后出现的位数-a、A、e、E、f 和 F 转换的点字符,g 和 G 转换的最大有效位数,...

所以对于f,精度仅指定小数点后的位数,但对于g,它是所有位数的最大位数。 p>

2。为什么数字会向下取整?

在源码中使用浮点数时,编译时需要将十进制转换为二进制。十进制数 2.925 无法完全转换为二进制形式,而您的 double 类型的精度有限,并且值略小(2.92499999999999982236...)。当四舍五入为 2 位小数时,最接近的值为 2.92

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2011-06-14
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多