当前位置:  开发笔记 > 编程语言 > 正文

C#浮动bug?0.1 - 0.1 = 1.490116E-08

如何解决《C#浮动bug?0.1-0.1=1.490116E-08》经验,为你挑选了2个好方法。

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

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 Number类型,它可能有一个十进制而不是二进制浮点 - 无论如何,它永远不会给出这个输出.



1> Marc Gravell..:

对于浮点数学来说,这似乎很正常......你总是要检查一个小的delta来解决难以察觉的舍入差异.根据具体情况,decimal可能是您想要的.

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

另见Jon Skeet的页面:

二进制浮点

十进制浮点


TCHA.当我甚至不能成为第一个引用我自己的文章时,我是怎么想得到代表的呢?;)

2> duffymo..:

你显然需要阅读"每个计算机科学家应该知道的浮点数".

我没有想到我在这种情况下发现了一个错误,我通常认为我的一个假设需要先检查.

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有