我打印时,我的浮点数有额外的数字

我将浮点数定义为float transparency = 0.85f; 在下一行中,我将它传递给函数 – fcn_name(transparency) – 但事实certificate变量transparency值为0.850000002 ,当我使用默认设置打印时,它为0.850000002 。 对于值0.65f ,它是0.649999998

我该如何避免这个问题? 我知道浮点只是一个近似值,但如果我定义一个只有几位小数的浮点数,我怎样才能确定浮点数没有改变?

以二进制格式表示的浮点值没有任何特定的小数精度。 仅仅因为你在一些规范中读到这个数字可以代表一些固定数量的十进制数字,它并不是真的意味着什么。 它只是物理(和有意义的)二进制精度的粗略转换,而不是有意义的十进制近似。

二进制浮点格式的一个特性是它只能精确地(在其尾数宽度的范围内)表示可以表示为2的有限幂次数(包括2的负幂)的数字。 像0.75 (十进制)这样的数字将以二进制浮点格式精确表示,因为这些数字是2( 2^-1 2^-2 )的幂或其总和。

同时,十进制0.1这样的数不能用2的幂的有限和表示。浮点二进制的十进制0.1的表示具有无限长度。 这立即意味着0.1不能以有限二进制浮点格式精确表示。 请注意, 0.1只有一个十进制数字。 但是,这个数字仍然无法表示。 这说明了以十进制数表示浮点精度的事实并不是很有用。

您示例中的0.850.65类的值也是不可表示的,这就是为什么在转换为有限二进制浮点格式后看到这些值失真的原因。 实际上,你必须习惯这样一个事实,即你在日常生活中遇到的大多数小数十进制数将无法在二进制浮点类型中精确表示, 无论这些浮点类型有多大

我能想到解决这个问题的唯一方法是将特性和尾数分别传递给函数,让IT人员适当地设置值。

如果你想要更高的精度,

http://www.drdobbs.com/cpp/fixed-point-arithmetic-types-for-c/184401992是我所知道的文章。 虽然这只适用于C ++。 (搜索等效的C实现)。

我试过VS2010,

 #include  void printfloat(float f) { printf("%f",f); } int main(int argc, char *argv[]) { float f = 0.24f; printfloat(f); return 0; } OUTPUT: 0.240000