首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

截取小数部分,数发生了变化,该如何处理

2012-05-22 
截取小数部分,数发生了变化代码如下:#includeiostreamusing namespace stdvoid splitfloat(float x,int

截取小数部分,数发生了变化
代码如下:
#include<iostream>
using namespace std;
void splitfloat(float x,int *intpart,float *fracpart)
{
*intpart=int(x);
*fracpart=x-*intpart;
}
int main()
{
int i,n;
float x,f;
cout<<"Enter 3 float point numbers:"<<endl;
for(i=0;i<3;i++)
{
cout<<"\n";
cin>>x;
splitfloat(x,&n,&f);
cout<<"Integer Part="<<n<<"\nFraction Part="<<f<<endl;
}
return 0;
}


Enter 3 float point numbers:

213412.342
Integer Part=213412
Fraction Part=0.34375
//为什么Fraction Part=0.34375而不是0.342??
2345234523452.23452
Integer Part=182452224
Fraction Part=2.34505e+012
//Fraction Part=2.34505e+012这又是为啥??


[解决办法]
单精度用float表示,在计算机中使用4位字节(32位bit)来表示,具有7位有效数字
float类型存储的时候1个bit是符号位,8个bit是指数位,剩下的23个bit是有效数字位
[解决办法]
float 改成double ,再看看~
[解决办法]

C/C++ code
//Round(1.234,2) = 1.23//Round(1.234,0) = 1.0//Round(123.4,-1) = 120.0double Round(double dVal, short iPlaces) {    double dRetval;    double dMod = 0.0000001;    if (dVal<0.0) dMod=-0.0000001;    dRetval=dVal;    dRetval+=(5.0/pow(10.0,iPlaces+1.0));    dRetval*=pow(10.0,iPlaces);    dRetval=floor(dRetval+dMod);    dRetval/=pow(10.0,iPlaces);    return(dRetval);}double round(double dVal, short iPlaces) //iPlaces>=0{    unsigned char s[20];    double dRetval;    sprintf(s,"%.*lf",iPlaces,dVal);    sscanf(s,"%lf",&dRetval);    return (dRetval);}
[解决办法]
楼主输入的数值都超出了float的精度范围(7~8位有效数字)了。
[解决办法]
并不是截取才不对的,赋值之后就已经不对了
float a=12345678;
float b=12345679;
加断点的查看a和b的值,你会发现都是一样的,因为单精浮点表示只能7个有效数字

[解决办法]
改成double不就行了?
[解决办法]
你在看郑莉,董渊的C++程序设计,加我QQ346581442,我也在看

热点排行