
C++ 求float类型数据小数部分
如floatnum=299.1这样算下来,小数部分应该为0.1事实上,299.1-299=0.100006.等高手解决问题我只是举个例子,我想说的是任意float类型数据...
如 float num = 299.1
这样算下来,小数部分应该为0.1
事实上,299.1 - 299 =0.100006.
等高手解决问题
我只是举个例子,我想说的是任意float类型数据的小数部分,而且这个数据小数位数也是可变的,并不固定 展开
这样算下来,小数部分应该为0.1
事实上,299.1 - 299 =0.100006.
等高手解决问题
我只是举个例子,我想说的是任意float类型数据的小数部分,而且这个数据小数位数也是可变的,并不固定 展开
2个回答
展开全部
数字在计算机内以二进制存储 ,只能表示一些离散的点 ,实数是连续的 ,计算机自动取最接近的那个点来表示某个实数。
比如说想要把 299.1 化为二进制 ,299 为 1 0010 1011
而小数部分 .1 化为 0.00011001100110011 …… ,无法有准确的二进制表示。
故 299.1 二进制为 1 0010 1011.00011001100110011…… ,也没有准确表示,按照 IEEE 标准 ,单精度浮点数有 32 位 ,其中尾数部分 23位 ,故 299.1在计算机内表示为 0 10000111 0010101100011001100110_ ,这最后一位是啥就看进位是怎么选择的了 ,这个数再解释回来就不是原来的 299.1 了。
这只是个原理 ,上面的数我没有仔细算,楼主感兴趣的话可以查阅相关标准。
比如说想要把 299.1 化为二进制 ,299 为 1 0010 1011
而小数部分 .1 化为 0.00011001100110011 …… ,无法有准确的二进制表示。
故 299.1 二进制为 1 0010 1011.00011001100110011…… ,也没有准确表示,按照 IEEE 标准 ,单精度浮点数有 32 位 ,其中尾数部分 23位 ,故 299.1在计算机内表示为 0 10000111 0010101100011001100110_ ,这最后一位是啥就看进位是怎么选择的了 ,这个数再解释回来就不是原来的 299.1 了。
这只是个原理 ,上面的数我没有仔细算,楼主感兴趣的话可以查阅相关标准。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询