【C语言基础】float、double 浮点数类型的四舍五入问题

发布时间 2023-12-04 21:48:26作者: FBshark

简短不看版:

C语言中,不能进行 double a == double b 这样的运算。

另外,printf(".1f", &double) 的时候,数据输出不同时候,可能会不一样。

根本问题时float类型或者double类型的浮点数在计算机中不能精确储存。

              单精度浮点型(float)存储方式

比如,若我们希望计算机储存的是2.445,但实际上计算机可能储存的是2.44499997844,又或者储存的是2.44500045123。由于无法保证完全精确储存,所以导致了不同情况下第N+1位位5时候保留小数出现的情况不同。

调试办法:printf()的时候使用%.10f,看看他到底储存的是什么,例如如下:

 

 

问题背景:

%.1f 其实是有四舍五入的功能的,如下图所示:

但也有不正常工作的时候,float保留几位小数时是否具有四舍五入的功能?或者有时候自己如何去四舍五入,有时候不想四舍五入?

保留两位小数时,按理来说保留两位小数点都应该是2.45,可是第一个float调试出来就出现了问题,这到底是怎么回事呢?

不管是%.1f还是%.2f,对于float保留小数时,确实是具有四舍五入功能的

但是根本问题是float类型或者double类型的浮点数在计算机中不能精确储存但是double类型相对来说精确储存能力又强一些。

其中集中表现在要保留N位小数时,恰好第N+1位小数是数字5,此时会出现明显差异,达不到预期效果:

比方说:我们希望计算机储存的是2.445,但实际上计算机可能储存的是2.44499997844,又或者储存的是2.44500045123。由于无法保证完全精确储存,所以导致了不同情况下第N+1位位5时候保留小数出现的情况不同

至此我们也就能够理解了,对于2.44499997844,保留两位小数时,小数点后第三位为4,所以输出2.44,对于2.44500045123,保留两位小数时,小数点后第三位为5,所以输出为2.45!



转载自CSDN博主「荔枝荷包蛋666」:https://blog.csdn.net/qq_73814284/article/details/127334155

扩展文章:float double浮点型深度解刨:https://blog.csdn.net/m0_63125842/article/details/127313071?spm=1001.2014.3001.5501