小数如何工作?

时间:2011-02-18 20:24:08

标签: c# decimal

我在C#中看了十进制,但我并不是100%确定它做了什么。 有损吗?在使用1.0000000000001f+1.0000000000001f2让你float这是正确的)时,在C#中写double会产生2.0000000000002,是否可以添加两个小数而不是得到正确的答案?

我可以使用多少个小数位?我看到MaxValue是79228162514264337593543950335但如果我减去1我可以使用多少小数位?

我应该知道的怪癖吗?在C#中它的128位,在其他语言中它有多少位,它的工作方式与C#decimal一样吗? (当添加,分割,乘法时)

3 个答案:

答案 0 :(得分:14)

您展示的内容不是decimal - 它是float。他们是非常不同的类型。 ffloat的后缀,又名System.Singlemdecimal的后缀,又名System.Decimal。从您的问题中不清楚您是否认为这实际上是使用decimal,或者您是否只是使用float来证明您的恐惧。

如果您使用1.0000000000001m + 1.0000000000001m,您将获得完全正确的值。请注意,顺便说一句,double版本无法准确表达任何一个单独的值。

我在.NET中有关于这两种浮点的文章,你应该沿着其他资源彻底阅读它们:

所有浮点类型当然都有其限制,但特别是期望二进制浮点能够准确地表示十进制值,例如0.1。它仍然不能代表任何不能用28/29十进制数字表示的东西 - 所以如果你将1除以3​​,你当然不会得到确切的答案。

您还应注意decimal范围远小于double范围。因此,虽然它可以具有28-29个十进制数字的精度,但您不能表示真正的大数字(例如10 200 )或微小数字(例如10 -200 )。

答案 1 :(得分:-3)

编程中的小数(几乎)从不100%准确。有时将十进制值乘以一个非常高的数字然后计算更好,但这只是在你确定该值总是在0和100之间时(因此它不会超出maxvalue的范围) )

答案 2 :(得分:-3)

浮点本质上是不精确的。有些数字不能忠实地表达。十进制是一个高精度的大浮点。如果您查看the page at msdn,就可以看到“28-29有效数字”。 .net框架类与语言无关。他们将使用.net。

的每种语言都一样


编辑(响应Jon Skeet):如果使用上面的数字初始化Decimal类,小数点后面的数字小于28位,只要二进制表示是精确的,数字就会忠实存储。由于它以64位格式工作,我假设128位将完美地处理它。有些数字,例如0.1,永远不会完全可以表示,因为它们是二进制的重复序列。