C#神奇地浮动变化值

C#神奇地浮动变化值,c#,floating-point,C#,Floating Point,我有一个浮点数,它包含一个非常重要的值,必须非常精确。 我遇到的问题是,我总是只更改浮点值+和-(这里没有除法)。在更改该值大约20次后,该值不是预期的0.05,而是0.0499989。为什么?我不是在铸造浮点数,我不是在铸造浮点数,但它神奇地从0.05变为0.049989。我尝试了Math.Round(值,2)但也不会返回0.05。现在我该怎么办呢?许多(如果不是大多数)语言中的浮点变量只包含实际值的不精确近似值。您可以使用decimal数据类型在C#中解决此问题 问题在于,使用float时,



我有一个浮点数,它包含一个非常重要的值,必须非常精确。

我遇到的问题是,我总是只更改浮点值+和-(这里没有除法)。
在更改该值大约20次后,该值不是预期的0.05,而是0.0499989。
为什么?我不是在铸造浮点数,我不是在铸造浮点数,但它神奇地从0.05变为0.049989。
我尝试了
Math.Round(值,2)但也不会返回0.05。现在我该怎么办呢?

许多(如果不是大多数)语言中的浮点变量只包含实际值的不精确近似值。您可以使用
decimal
数据类型在C#中解决此问题

问题在于,使用float时,某些分数无法准确表示。考虑使用十进制数据类型,如果只使用+和-,就不应该有这个问题,因为十进制在内部使用基数10。< /P> < P>浮点和双值存储在二进制(Base 2)中。 因此,它们不能准确地表示像
.3
这样没有二进制有限长度表示的数字

类似地,以10为基数存储的
十进制
,不能准确地表示像
1/3
这样没有十进制有限长度表示的数字


您需要一个任意精度的算术库。

就像
int
变量只能保存某个范围内的整数一样,
float
只能保存某些值<代码>0.05
不是其中之一

如果将
int
变量设置为(比如)3.4,它实际上不会保存值3.4;它将保存转换为可表示的
int
value:3的值


类似地,如果将
float
变量设置为
0.05
,则无法获得准确的值;相反,它会将该值转换为最接近的值,表示为
浮点值
。这就是你所看到的。

你所说的“设计”是什么意思。一个值是如何通过设计而改变的?它的可能复制不会神奇地改变它永远不会是0.05。请参阅下面的原因“我有一个浮点数,它包含一个非常重要的值,必须非常精确”。浮点表示法的范围很广,但精度有限。如果需要非常精确的值,则需要不同的数据类型,或者需要非常小心地执行操作。这不一定是一个简单的问题。我回忆起我的数值分析()课程,它解决了这些问题,是我参加的较难的计算机科学课程之一。任意精度的数学库不能解决这个问题,因为它们使用(任意)有限精度,
0.05
不能用任何有限数量的二进制数字表示。实际上需要的是符号表示,或者理性表示,或者提问者自学浮点运算并适当调整算法。谢谢你的快速回答。它确实适用于
十进制
。浮点和小数都有表示错误,而小数实际上在每一位精度的基础上有更大的平均表示错误。它们之间的区别在于,十进制中表示错误为零的数量是您在进行财务计算时可能希望表示的数量。