0

这是怎么回事?!减法工作正常,直到我达到 0.1 - 0.1。我在 Visual c# 2008 中使用 nonoba.com API。

Console.WriteLine("hit! " + Users[targetNum].character.health + " : " + player.character.profile.attackPower);

Users[targetNum].character.health -= player.character.profile.attackPower;

Console.WriteLine("health! " + Users[targetNum].character.health);

输出:

hit! 0.1 : 0.1
health! 1.490116E-08

谢谢大家 - 我可能会使用小数类型,因为我通常会添加/减去漂亮的“圆形”数字。现在我会选择:

if (Users[targetNum].character.health <= 0.00001)

顺便说一句,我知道这实际上不会成为 c# 中的“错误”——我认为它可能是由于我的代码中的错误或缺乏理解,事实确实如此。

阅读完所有推荐读物后,我将得出结论,我的愚蠢是由于通常使用 ActionScript Number 类型,它可能具有十进制而不是二进制浮点 - 无论如何,它永远不会给出此输出。

4

5 回答 5

17

这对于浮点数学来说似乎很正常......你总是必须检查一个小的增量来解释难以察觉的舍入差异。根据场景,decimal可能是您想要的。

基本上,除非你能确定在这两种情况下它是完全相同的 0.1(即没有对它们做任何事情),你不可能得到零。一般来说,你会得到几乎为零的东西。有了decimal你,你通常会直观地得到更多你期望的东西。

另请参阅 Jon Skeet 的页面:

于 2009-01-25T23:02:53.560 回答
12

您显然需要阅读“每个计算机科学家应该知道的关于浮点数的知识”

我通常不会认为我在这种情况下发现了错误,而是假设我的一个假设需要首先检查。

于 2009-01-25T23:11:14.040 回答
1

如果您总是添加和减去“漂亮的整数”数字,即十分之一或百分之一,那么您可以以整数十分之一为单位跟踪您的命中和健康值。一个类比是一个金融程序,它以整数美分而不是浮点美元来跟踪货币。使用整数避免了浮点数学的所有问题。

于 2009-01-25T23:48:51.220 回答
0

浮点数学在任何语言中总是近似的,因为这就是 CPU 的工作方式。如果你关心你的答案的绝对精度——例如,因为你正在处理金钱——那么你不应该使用浮点数。

于 2009-01-25T23:12:44.960 回答
0

有点离题,但这是一个有趣的读物,描述了为什么cos(x) != cos(y)即使x == y

http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.18

于 2009-11-08T13:19:57.447 回答