当前位置: 代码迷 >> VC/MFC >> 一个关于浮点数的有关问题
  详细解决方案

一个关于浮点数的有关问题

热度:79   发布时间:2016-05-02 03:27:22.0
请教大家一个关于浮点数的问题
我用VC6.0调试时,遇到这种情况:用CString格式化一个float,结果尾数出现了偏差。调试时的截图:




这是什么原因,求教
------解决思路----------------------
因为很多浮点数用二进制就没办法精确表示,不信楼主查看float f = 0.1f;  
float有效位就7位,而如果写成%f,一般会取到小数点后5位,也可能是不准确的
所以建议楼主要么写成%0.3f只取3位,要么使用精度更高的double(虽然他也不能绝对精确,但通常够了)
------解决思路----------------------
引用:
Quote: 引用:

因为很多浮点数用二进制就没办法精确表示,不信楼主查看float f = 0.1f;  
float有效位就7位,而如果写成%f,一般会取到小数点后5位,也可能是不准确的
所以建议楼主要么写成%0.3f只取3位,要么使用精度更高的double(虽然他也不能绝对精确,但通常够了)


谢谢指教。

我试过double类型,是一样的。

现在的问题是float类型变量f的值并没有发生偏差,只是在转成字符串才发生这样的问题。如果是浮点数本身的问题的话,应该调试时看f的值就是不准确的才对吧。


double怎么可能是一样的呢,你多搞几位就看出来了,比如

float aa = 777777.78956f 和double aa = 777777.78956

所以尽量用double,不要用float
------解决思路----------------------
我帮你用VC6与VS均调试过,不会出现你说的现象啊,得到的字符串为:“777.987000”
------解决思路----------------------
二进制本来就不能精确表示浮点数,总是有误差的,不管是用float还是double,但是无论如果,不可能出现3位数就有这么大偏差。
而且,内存中的数显示有误差。
------解决思路----------------------
%.6g
  相关解决方案