C语言浮点数与printf格式化输出(四舍五入的问题)

测试数据0.0045. 在printf中的打印情况:

double n = 0.0045;

语句

结果


printf("%.3f ",n);

0.004

四舍五入异常!!!

printf("%.4f ",n);

0.0045


printf("%.5f ",n);

0.00450


printf("%f ",n);

0.004500


printf("%f ",0.0045);

0.004500


出现这个问题时, 将鼠标放置在IDE(vscode)上,看到了如下展示:


打开在线进制转换:

先把0.0045转成2进制: 结果是.0000000100100110111010010111100011010100111111011111001111



再将上述2进制转成十进制:


发现数据不一样了. 整理对比了一下 2个数字的二进制情况:


结论:

计算机在计算0.0045的二进制时,遇到了无限循环,同时又受到位的限制. 所以表达上只能舍弃后面的部分.


当要打印出0.0045数字小数点后3位时,因二进制存在误差,实际是0.0044999****的一个数,这个时候对小数点后第四位(实际是4)做取舍, 然后丢掉. 所以打印出来是0.004. 而不是我们设想中的第四位(5)进位,表示出0.005

展开阅读全文

页面更新:2024-03-03

标签:在线   小数点   误差   语句   个数   结论   异常   语言   情况   发现   数字

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top