C中划分的奇怪结果

时间:2009-06-12 08:31:35

标签: c visual-studio math

  

有些重复:
  1.265 * 10000 = 126499.99999999999 ?????
  How is floating point stored? When does it matter?
  Strange floating-point behaviour in a Java program
  Why do I see a double variable initialized to some value like 21.4 as 21.399999618530273?
  Error in Flash addition

我将23除以40(23/40)。在C中,该操作结果为0.5749999999999996。但实际上它必须是0.575!

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:4)

这是存储浮点数的工件。

你可以绕回答sprintf(“%。3f”,结果)或使用一些十进制处理包。

答案 1 :(得分:4)

看看这个 - 它应该告诉你关于Why Computers Suck At Math

需要知道的一切

答案 2 :(得分:4)

问题是因为.575值在浮点编码中没有精确表示。修复取决于您必须处理的值以及不准确性的影响。

如果只是显示问题,请使用舍入到3位小数,然后得到0.575。

如果是因为计算不准确,请尝试将值保持为精确的分数。您将必须存储和处理两个浮点值,但它将是准确的。当需要结果时,将有效除法推迟到最后一刻。

检查两个值之间的差异是否与您的问题相关。例如,将sqrt epsilon减去该值,并检查更改对最终计算结果的影响程度,并将其与所需或所需的精度进行比较。

不幸的是,我们必须忍受浮动中实际值表示的限制。使用128位精度浮点数会使误差小得多,但不会为空。

答案 3 :(得分:2)

我建议你在网上搜索“浮点准确度”,或者查看关于你的其他几十个问题,你的问题是重复的。

答案 4 :(得分:2)

使用floating point算术是正常的。您可以使用%.3g更改 float double 的打印方式,例如

答案 5 :(得分:2)

你无法解决这个问题。并非所有数字都可以表示为浮点数,请参阅"how is floating point stored, when does it matter"