use*_*854 15 c c++ double printf rounding
有人可以解释这种行为吗?我很清楚浮点数的机器级表示.这似乎与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);
}
Run Code Online (Sandbox Code Playgroud)
输出:
> 108.765625000000000000000000000000
> 108.76562
> 6961.000000000000000000000000000000
> 108.046875000000000000000000000000
> 108.04688
> 6915.000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
注意,第一个数字向下舍入,第二个数字向上舍入.
Dan*_*her 19
这是"一半到一半"或"银行家的四舍五入".圆形表示的最后一位数被选择为即使数字正好在两者之间.
http://linuxgazette.net/144/misc/lg/a_question_of_rounding_in_issue_143.html:
"对于GNU C库,printf()使用的舍入规则是"银行家舍入"或"舍入到偶数".这比一些其他的C库,正如C99规范所说,转换为十进制应该使用当前选择的IEEE舍入模式(默认银行家舍入).
归档时间: |
|
查看次数: |
13778 次 |
最近记录: |