测试数据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
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号