以下是代码段:
float pNum = 9.2;
char* l_tmpCh = new char[255];
sprintf_s(l_tmpCh, 255, "%.9f", pNum);
cout << l_tmpCh << endl;
delete l_tmpCh;
输出为:9.199999809
怎么做才能使结果为9.200000000
注意:我需要每个以9位小数精度打印的浮点数,所以我不想让9.2
答案 0 :(得分:8)
解决方法是不使用浮点数..
并非每个数字都能以浮点格式准确表示,例如9.2。或0.1。
如果你想要显示所有小数,那么你得到9.199999809
,因为它的浮点值最接近9.2。
如果使用浮点数,则必须接受此不准确性。否则,您唯一的选择是以另一种格式存储该号码。
答案 1 :(得分:3)
32位二进制浮点数不能有9位精度(there is only 7)。你可以通过附加3个零来伪造它。
sprintf_s(l_tmpCh, 255, "%.6f000", pNum);
如果整数部分已经耗尽了很多精度,那么这将不起作用,例如9222.2f
将9222.200195000
。
答案 2 :(得分:1)
在一般情况下,您所要求的是不可能的,因为定义的浮点数是近似值,可能有也可能没有十进制的精确表示。阅读着名的Goldberg论文:http://docs.sun.com/source/806-3568/ncg_goldberg.html
答案 3 :(得分:0)
使用双字面而不是浮点字面值。
double pNum = 9.2;
char* l_tmpCh = new char[255];
sprintf_s(l_tmpCh, 255, "%.9f", pNum);
cout << l_tmpCh << endl;
delete l_tmpCh;
f正在使文字浮动;没有它,该值是双字面值(更准确地说,大约15个十进制数字)。
当然,如果15位数不够,欢迎您创建自己的类来表示值。
答案 4 :(得分:0)
这应该这样做:
double pNum = 9.2;
f
后缀使其成为float
字面值,其精度只有大约7位小数,当然还有representation errors。将其分配给double
变量并不能解决此问题。当然,这假设float
和double
对应于IEEE 754单精度和双精度类型。
编辑:如果您想使用float
,则根本无法解决此问题。阅读The Floating-Point Guide以了解原因。
答案 5 :(得分:0)
重要的是要理解本机浮点数很少“准确”,因为它们在计算机中的表示方式。因此大多数时候你只得到一个近似值。使用printf,您还可以指定将该近似值舍入为输出的精度。例如。 “%。20f”将为您提供在“。”之后舍入为20位的表示。