Ⅰ “初始化”: 从“double”到“float”截断
在 C 语言中,如果不指定数据类型,那么小数常量会被认为是 double 类型的。
如:float x;
x = 1.2;
其中 x 是 float 类型的,但是 1.2 是 double 类型的,由于它是常量,所以编译器称为 const double。double 是不能隐式转换为 float 的,这时候可改成 x=1.2f; 或者 x=1.2F; 就可以了。
(1)如何解决编译器截断小数扩展阅读:
double和float的区别
两者的主要区别如下:
1.在内存中占有的字节数不同:
单精度浮点数在机内存占4个字节
双精度浮点数在机内存占8个字节
2.有效数字位数不同:
单精度浮点数有效数字8位
双精度浮点数有效数字16位
3.数值取值范围:
单精度浮点数的表示范围:-3.40E+38~3.40E+38
双精度浮点数的表示范围:-1.79E+308~-1.79E+308
4.在程序中处理速度不同:
一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快
Ⅱ c语言abs会把小数部分去掉吗
会的。
abs为C语言的库函数,位于stdlib.h,其格式为
int abs (int x);
功能为取x的绝对值并返回。
可以看到该函数参数和返回值是整型的,当传入浮点型参数时,会先被强制转换为整型,其表现为小数部分会被去掉。
要想保持小数部分,可以使用用于浮点数的绝对值函数fabs,用法与abs相同。
Ⅲ c语言问题
结果虽然相同,但还是有区别的,如下:
1.x=a*b/100: a,b都是整型,a*b会用一个长整型临时变量存储,这里的除法是整数除法,得到的结果是整型数,如果有小数会被截断,最后赋值给x的时候,会转换为浮点数。
2.y=(long) (a*b)/100:先将a*b的结果强制转换为长整型,再进行整数除法,其它同上。
3.z=(long)a*b/100:先将a强制转换为长整型,其它同上。
Ⅳ 如何在C++语言中对浮点数进行格式化处理
如有一个函数,其可接受一个long double参数,并将参数转换为字符串,结果字符串应保留两位小数,例如,浮点值123.45678应该生成"123.45"这样的字符串。表面上看来这是一个意义不大的编程问题,然而,如果真要在实际中派上用场,函数应设计为具有一定弹性,以允许调用者指定小数位数。另外,函数也应该能够处理各种异常情况,如像123.0或123这样的整数。
在开始之前,先看一下编写"优雅"C++代码时的两句"真言":
"真言"1:无论何时需要格式化一个数值,都应先转换为一个字符串。这样可保证每位数刚好占据一个字符。
字串4
"真言"2:在需要转换为字符串时,请使用<sstream>库。
转换函数的接口非常简洁:第一个参数是需被格式化的数值;第二个参数代表小数点后显示的小数位,且应该具有一个默认值;返回值为一个string类型:
string do_fraction(long double value, int decplaces=3);
注意,第二个参数代表的小数位数中包括了小数点,因此,两位小数需要默认值为3.
精度问题
当然,第一步是把long double值转换为一个string,使用标准C++库<sstream>简直是手到擒来。然而,有一件事情必须引起注意,因为某些原因, stringstream对象默认精度为6,而许多程序员错误地把"精度"理解为小数的位数,这是不正确的,精度应指代全部位数。因而,数字 1234.56可安全地 通过默认精度6来表示,但12345.67会被截断为12345.6.这样的话,如果你有一个非常大的数,如1234567.8,它的结果会静悄悄地转换 为科学记数法:1.23457e+06,这显然不是我们想要的。为避免这样的麻烦,在开始转换之前,应把默认精度设为最大。
字串8为得到long double能表示的最大位数,可使用<limits>库: string do_fraction(long double value, int decplaces=3)
{
int prec=numeric_limits<long double>::digits10; // 18
ostringstream out;
out.precision(prec);//覆盖默认精度
out<<value;
string str= out.str(); //从流中取出字符串 数值现在存储在str中,等待格式化。
小数点的位置
要进行格式化,首先要确定小数点的位置,如果小数位多于decplaces,do_fraction()会删除多余的。
要定位小数位,可使用string::find(),在STL算法中使用了一个常量来代表"数值未找到",在字符串中,这个常量为string::npos: 字串4
char DECIMAL_POINT='.'; // 欧洲用法为','
size_t n=str.find(DECIMAL_POINT);
if ((n!=string::npos)//是否有小数点呢?
{
//检查小数的位数
}
如果没有小数点,函数直接返回字符串,否则,函数将继续检查小数位是否多于decplaces.如果是,小数部分将会被截断: size_t n=str.find(DECIMAL_POINT);
if ((n!=string::npos)//有小数点吗?
&&(str.size()> n+decplaces)) //后面至少还有decplaces位吗?
//在小数decplaces位之后写入nul
str[n+decplaces]='