C中的浮点数组

我正在开发一个代码,我必须在文本文件中一次加载存储在每一行中的浮点值…我使用fscanf()将每个数据加载到一个浮点数组中…但是我发现浮点数以不同的方式存储,例如407.18存储为407.179993,414.35存储为414.350006 …现在我被卡住了,因为数据以它们在文件中的forms存储是绝对重要但这里似乎是虽然基本上是相同的……但是我如何得到以原始forms存储的数字?

如果数字以它们在文件中的forms存储是绝对重要的, 请不要使用浮点值 。 并非所有小数基数为10的值都可以用二进制精确表示。

有关详细信息,请参阅文章“每个计算机科学家应该知道的关于浮点运算的内容” [PDF链接]。

您应该以字符串forms或缩放整数存储数字。

你看到的是正确的,因为浮点不能完全代表许多实数。 这是必须阅读的: 每个计算机科学家应该知道浮点运算

C ++ floatdouble类型表示为IEEE浮点数。 有二进制浮点数,而不是小数。 它们没有无限精度,甚至相对“简单”的十进制值在转换为二进制浮点和返回时也会改变。

专注于货币的语言(COBOL和PL / I,例如)具有使用较慢表示而没有此问题的十进制数据类型。 在C或C ++中有用于此目的的库,或者如果您不需要太多范围,则可以使用缩放整数。

sfactor,有点澄清:你说“……绝对重要的是数字以文件forms存储” – 这是什么forms的? 我假设一个展示forms?! 这是交易:如果你存储在文件407.18中,但它显示为407.179993 – 这是完全正常的和预期的。 当您构建sprintf或正在使用的任何格式化打印时,必须指示它限制小数点后的精度。 这应该是诀窍:

 #include  void main(void); void main() { printf("%.2f",407.179993); } 

您可能希望查看实现具有受控舍入的浮点的现有库。 我用过MPFR 。 它是快速和开源的。 如果你正在使用金钱,那么另一个图书馆会更好。

存储数字的方式有很多种 – 每种方式都有其优点和缺点。

在您的情况下,浮点数不是最佳选择,因为它们并不完全代表大多数实数。

缩放整数是常见设计习语的一种情况:与演示文稿分开表示。

确定小数点后所需的位数,例如。 如123,45中的2位数。 然后,您应该将数字表示为整数12345.无论何时向用户显示值,都应在相关位置插入小数点。

Danny Kalev关于Scaled Integers的简短InformIT文章

在对缩放的整数进行过度操作之前,请仔细检查问题的域,以断言浮点数中的“松弛”足以使用缩放的整数进行警告。