是否有一个printf宽度说明符可以应用于浮点说明符,该说明符将自动将输出格式化为必要的有效数字数 ,以便在重新扫描string时获取原始浮点值? 例如,假设我打印一个float到2位小数的精度: float foobar = 0.9375; printf("%.2f", foobar); // prints out 0.94 当我扫描输出0.94 ,我没有符合标准的保证,我会得到原来的0.9375浮点值(在这个例子中,我可能不会)。 我想要一个方法告诉printf自动将浮点值打印到必要的有效位数,以确保可以将其扫描回传递给printf的原始值。 我可以使用float.h一些macros来派生出传递给printf 的最大宽度 ,但是是否已经存在一个说明符来自动打印到必要数量的有效数字 – 或者至less是最大宽度?
有关于浮点表示的问题已经有了几个问题。 例如,十进制数字0.1没有精确的二进制表示,所以使用==运算符将其与另一个浮点数字进行比较是危险的。 我理解浮点表示的原理。 我不明白的是,从math的angular度来看,为什么小数点右边的数字再向左边的那个“特别”呢? 例如,数字61.0具有精确的二进制表示,因为任何数字的整数部分总是精确的。 但数字6.10并不确切。 我所做的只是把小数点后移一位,突然间我从Exactopia变成了Inexactville。 在math上,这两个数字之间应该没有内在的差别 – 它们只是数字。 相比之下,如果我把小数位移到另一个方向来产生数字610,我仍然在Exactopia中。 我可以继续沿着这个方向(6100,610000000,610000000000000),他们仍然是确切的,确切的,确切的。 但是一旦小数点越过某个阈值,数字就不再精确。 这是怎么回事? 编辑:为了澄清,我想远离关于IEEE等行业标准表示的讨论,坚持我认为是math“纯”的方式。 在基数10中,位置值是: … 1000 100 10 1 1/10 1/100 … 在二进制中,他们将是: … 8 4 2 1 1/2 1/4 1/8 … 这些数字也没有任何限制。 这些头寸无限地向左和向右增加。
.NET中的decimal , float和double什么区别? 什么时候有人使用其中之一?