C++编程 CString用atof转换成float时,值从0.39999变成了0.39998999.请问是啥问题?该怎么解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++编程 CString用atof转换成float时,值从0.39999变成了0.39998999.请问是啥问题?该怎么解决?相关的知识,希望对你有一定的参考价值。

浮点数的精度有限,不是每个你用字符串写出来的小数都有完全对应的浮点数的。
要解决,你可以使用更高精度的浮点数,或者特殊的小数处理类库,或者用定点数表示浮点数追问

特殊的小数处理类库,或者用定点数表示浮点数 怎么做呢?

追答

特殊的小数处理库,是指专门为小树精确计算编写的库,具体使用因库而异。

定点数,是指用整数存储逻辑上的小数,但你自己要知道小数点在哪里
比如用12345678来表示123456.78这样的数,来进行小数点后两位的计算,避免浮点数的问题,因为整数加减是精确的。前提是你的程序中要记得小数点实际位置

参考技术A 对精度要求更高的话,可以使用strtod()。 参考技术B 浮点数精度问题

可以在输出时格式化的方法解决:sprintf(stdout, "%.5f", n);这样输出, 就是0.39999
参考技术C 浮点数转换的基础规则:如十进制的 0.5 = 2的-1次方,0.25 = 2的-2次方,同理,0.125 = 2的-3次方。以此下去
说了上边的基础后,能知道方法是:0.5(10) = 0.1(2),0.25(10) = 0.01(2),0.75 = 0.5+0.25 = 0.11(2),0.625 = 0.5+0.125 = 0.101
细心会发现,存在将一个有穷的十进制的小数转为无穷二进制的现象(例如0.7 = 0.5+0.125+0.625+...),因为位数有限,最后会出现“掉位”。
这个是有解决办法的,不过现在就快上课了

以上是关于C++编程 CString用atof转换成float时,值从0.39999变成了0.39998999.请问是啥问题?该怎么解决?的主要内容,如果未能解决你的问题,请参考以下文章

如何将CString转换成wstring

C或C++中如何把一个double型的数转换成字符串?

c++中如何把string类型转化为float类型

将 CString 转换为浮点数

C++中,如何讲CHAR数组转换成FLOAT型数据。

MFC中如何吧CString类型转换为double或int型??