c++ - double 的 printf 舍入行为

标签 c++ floating-point printf rounding

有人可以解释这种行为吗?我很清楚 float 的机器级表示。这似乎与 printf 及其格式有关。 这两个数字都用浮点表示法精确表示(检查:乘以 64 得到一个整数)。

#include <stdio.h>
#include <iostream>
using namespace std;

int main() {
  double x1=108.765625;
  printf("%34.30f\n", x1);
  printf("%9.5f\n", x1);
  printf("%34.30f\n", x1*64);

  double x2=108.046875;
  printf("%34.30lf\n", x2);
  printf("%9.5f\n", x2);
  printf("%34.30f\n", x2*64);
}

输出:

> 108.765625000000000000000000000000
> 108.76562
> 6961.000000000000000000000000000000
> 108.046875000000000000000000000000
> 108.04688
> 6915.000000000000000000000000000000

注意,第一个数字向下取整,第二个数字向上取整。

最佳答案

它是“四舍五入”或“银行家四舍五入”。选择舍入表示的最后一位数字,即使该数字恰好介于两者之间。

http://linuxgazette.net/144/misc/lg/a_question_of_rounding_in_issue_143.html :
“对于 GNU C 库,printf() 使用的舍入规则是“bankers rounding”或“round to even”。这比其他一些 C 库更正确,因为 C99 规范说转换为十进制应该使用当前选择 IEEE 舍入模式(默认银行家舍入)。"

关于c++ - double 的 printf 舍入行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10357192/

相关文章:

c++ - 奇怪的文本模式文件输出行为

bash - 如何更改 bash 中 printf 命令中的小数点分隔符?

c++ - 如何正确发送 CMFCMenuButton 选择的 ID 到消息映射?

c++ - 为什么 std::atomic<integral> 特化不提供乘法和除法赋值运算符?

objective-c - 比较浮点值有多危险?

python - 极值的 logit 和反 logit 函数

cuda 11内核不运行

c++ - 编译 libjpeg

c++ - 简单的 3x3 矩阵逆代码 (C++)

javascript - 如何在 Javascript 中检查一个值是否是整数(特殊情况 1.0 应该是 float )