2009-01-25 38 views
0

发生了什么事?减法工作正常,直到我达到0.1 - 0.1。我在使用nonoba.com API的visual c#2008中。C#浮动错误? 0.1 - 0.1 = 1.490116E-08

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#中的“错误”的方式 - 我以为它会无论是在我的代码或一些缺乏一个bug理解,这是。

读完所有推荐的阅读后,我将得出结论,我的愚蠢是由于通常使用的ActionScript编号类型,它可能有一个小数而不是二进制浮点 - 总之,它永远不会给这个输出。

+0

这看起来依稀像一个RPG或MMO游戏,不能你圆了呢? – 2009-01-25 23:18:22

回答

17

这对浮点数学来说似乎很正常......你总是要检查一个小的三角洲以解释不可察觉的舍入差异。根据情况,decimal可能是你想要的。

基本上,除非你能确定它是正好是在两种情况下都是相同的0.1(即没有对它们做过任何处理),你不可能得到零;一般来说,你会得到几乎为零的东西。通过decimal,您通常可以直观地获得更多您期望的结果。

参见乔恩斯基特的网页浏览:

+0

因此1.490116E-08只是一个非常小的数字,但并非零死于舍入误差?我如何解决? – Iain 2009-01-25 23:04:45

+1

使用`decimal`,舍入到已知的小数位,或者对小范围测试相等/差别为“足够接近” – 2009-01-25 23:06:33

0

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

1

如果您总是添加和减去“漂亮的回合”数字,即十分之一或百分之一,那么您可以以十分之一的整数单位跟踪您的命中和健康值。一个类比是一个财务计划,用于保持整数美分的货币,而不是浮点美元。使用整数可以避免浮点数学的所有问题。