浮点不准确的解决方法是什么?

时间:2010-10-13 10:51:15

标签: c++ floating-point

以下是代码段:

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

6 个答案:

答案 0 :(得分:8)

解决方法是不使用浮点数..

并非每个数字都能以浮点格式准确表示,例如9.2。或0.1。

如果你想要显示所有小数,那么你得到9.199999809,因为它的浮点值最接近9.2。

如果使用浮点数,则必须接受此不准确性。否则,您唯一的选择是以另一种格式存储该号码。

Required reading

答案 1 :(得分:3)

32位二进制浮点数不能有9位精度(there is only 7)。你可以通过附加3个零来伪造它。

sprintf_s(l_tmpCh, 255, "%.6f000", pNum);

如果整数部分已经耗尽了很多精度,那么这将不起作用,例如9222.2f9222.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变量并不能解决此问题。当然,这假设floatdouble对应于IEEE 754单精度和双精度类型。

编辑:如果您想使用float,则根本无法解决此问题。阅读The Floating-Point Guide以了解原因。

答案 5 :(得分:0)

重要的是要理解本机浮点数很少“准确”,因为它们在计算机中的表示方式。因此大多数时候你只得到一个近似值。使用printf,您还可以指定将该近似值舍入为输出的精度。例如。 “%。20f”将为您提供在“。”之后舍入为20位的表示。