c语言%f 12.390输出12.38999,为什么

只要是两位数及以上位数是这个输出,为啥,不应该是12.390000吗

img

img

嗨,你好。
如果你可以使用gdb 调试的话,这个问题,你看看内存就明白了。
因为double 的数,例如0.25,在内存中只能是个近似值,而不是精确值,0.25 在内存中可能是0.2499999,当你去两位去乘以100,有可能是0.24;
怎么做才可以呢?如果你想要保留两位,那么加上0.005 之后乘以100,就可以啦。。
详细可以看下:

https://ask.csdn.net/questions/7753796/53840832?spm=1001.2014.3001.5501

我之前在这里回复过,很详细

浮点数由于存储精度问题,是有误差的。
浮点数输出最好指定小数位数。它会自动四舍五入

您好,我可以给您的程序做一个修改。您想取多少位就取多少位

img

浮点数产生误差的原因,有两钟情况,会产生误差
1)以二进制保存浮点数,所以一些原本有限位的小数,可能变成一个无限循环的小数。比如:(十进制)0.9转成2进制是无限循环小数0.1110011001100110011...
2)计算机保存浮点数的精度有限,例如float可以保留十进制最多7位(二进制23位)有效数字,double 可以保留十进制15~16位(二进制52位)有效数字。那有效数字以后的就被忽略了。
float型数据改用double型来代替。

在C语言中,这种浮点数都是有误差的,这也是为什么需要你在输出格式(%.1f)中指定精确位数的原因