我在C#中看了十进制,但我并不是100%确定它做了什么。
有损吗?在使用1.0000000000001f+1.0000000000001f
(2
让你float
这是正确的)时,在C#中写double
会产生2.0000000000002
,是否可以添加两个小数而不是得到正确的答案?
我可以使用多少个小数位?我看到MaxValue是79228162514264337593543950335
但如果我减去1我可以使用多少小数位?
我应该知道的怪癖吗?在C#中它的128位,在其他语言中它有多少位,它的工作方式与C#decimal一样吗? (当添加,分割,乘法时)
答案 0 :(得分:14)
您展示的内容不是decimal
- 它是float
。他们是非常不同的类型。 f
是float
的后缀,又名System.Single
。 m
是decimal
的后缀,又名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,永远不会完全可以表示,因为它们是二进制的重复序列。