float f=0.01f;
printf("%f",f);
如果我们在调试过程中检查变量的值,发现变量f包含'0.0099999998'的值,而printf输出的是0.010000。
a. 是否有办法强制编译器将相同的值分配给float类型的变量?
b. 我想将float转换为字符串/字符数组。是否可能仅将完全相同的值转换为字符串/字符数组?我想确保没有填充零、填充不需要的值或更改数字,如上例所示。
float f=0.01f;
printf("%f",f);
如果我们在调试过程中检查变量的值,发现变量f包含'0.0099999998'的值,而printf输出的是0.010000。
a. 是否有办法强制编译器将相同的值分配给float类型的变量?
b. 我想将float转换为字符串/字符数组。是否可能仅将完全相同的值转换为字符串/字符数组?我想确保没有填充零、填充不需要的值或更改数字,如上例所示。
使用二进制值表示十进制数是不准确的,除了一些特定的数值(如0.25)。如果需要精确表示,必须从float/double内置类型转换为某种十进制数包。
boost::lexical_cast
:float blah = 0.01;
string w = boost::lexical_cast<string>( blah );
变量w
将包含文本值0.00999999978。但我看不出你什么时候真正需要它。
最好使用boost::format
来准确地将浮点数格式化为字符串。以下代码展示了如何实现:
float blah = 0.01;
string w = str( boost::format("%d") % blah ); // w contains exactly "0.01" now
请查看这个 C++ 参考文献,特别是精度部分:
float blah = 0.01;
printf ("%.2f\n", blah);
存在无数个实数。
float
、double
和long double
这些数据类型只能取有限数量的值。
也就是说,有无数个实数无法用这些数据类型精确表示。
你的调试器给出不同值的原因在Mark Ransom的帖子中有很好的解释。
关于打印浮点数而不进行四舍五入、截断并具有更完整的精度,你缺少了精度说明符 - printf的默认精度通常为6个小数位。
尝试以下代码以获得10位精度:
float amount = 0.0099999998;
printf("%.10f", amount);
float amount = 0.0099999998;
cout.precision(10);
cout << amount << endl;
std::ostringstream os;
os << f;
std::string s = os.str();
int sprintf(char* dst,const char* fmt,...);
char *ecvt(double value, int ndig, int *dec, int *sign);
char *fcvt(double value, int ndig, int *dec, int *sign);
sprintf 返回它写入字符串的字符数,例如
float f=12.00;
char buffer[32];
sprintf(buffer,"%4.2f",f) // will return 5, if it is an error it will return -1
ecvt和fcvt将字符返回到包含数字的静态char*位置,没有小数点,最重要的数字在前面,小数点的偏移量存储在dec中,符号在“sign”中(1=-,0=+),ndig是要存储的有效数字的数量。如果dec<0,则必须在小数点之前用-dec个零进行填充。如果您不确定,并且您不是在Windows7系统上工作(有时无法运行旧的DOS3程序),请查找Dos 3的TurboC版本2,仍然有一两个可用的下载,这是Borland的一个相对较小的Dos C / C ++编辑器/编译器,甚至带有TASM,16位机器代码386/486编译器,它在帮助文件中涵盖,以及许多其他有用的信息。
所有三个例程都在“stdlib.h”中,或者应该在其中,尽管我发现在VisualStudio2010上它们与标准完全不同,经常重载处理WORD大小的字符的函数,并要求您使用其自己的特定函数...“标准库太多了”,我几乎每次都会自言自语,“也许他们应该得到一个更好的字典!”
您需要查阅平台标准以确定如何最好地确定正确的格式,您需要将其显示为a*b^C,其中'a'是保留符号的整数部分,'b'是实现定义(可能由标准固定),而'C'是用于该数字的指数。
或者,您可以将其显示为十六进制,但对人类来说毫无意义,并且在所有实际目的上仍然是二进制。(并且同样可移植!)
f==hexstring2float(float2hexstring(f))