我查看了 C# 中的十进制,但我不能 100% 确定它做了什么。
有损吗?在C#写作中1.0000000000001f+1.0000000000001f
结果是2
使用时float
(double
得到你2.0000000000002
这是正确的)是否有可能将两个小数相加而得不到正确的答案?
我可以使用多少位小数?我看到 MaxValue 是79228162514264337593543950335
但如果我减去 1,我可以使用多少位小数?
有我应该知道的怪癖吗?在 C# 中它是 128 位,在其他语言中它是多少位,它的工作方式是否与 C# 十进制相同? (加、除、乘时)
你所展示的并不是decimal
- it's float
。他们是非常不同的类型。f
是后缀float
, aka System.Single http://msdn.microsoft.com/en-us/library/system.single.aspx. m
是后缀decimal
, aka System.Decimal http://msdn.microsoft.com/en-us/library/system.decimal.aspx。从你的问题中不清楚你是否认为这实际上是在使用decimal
,或者您是否只是使用float
来表达你的恐惧。
如果您使用 1.0000000000001m + 1.0000000000001m,您将获得完全正确的值。请注意,double
顺便说一句,版本无法准确表达任何一个单独的值。
我有关于 .NET 中两种浮点的文章,您应该仔细阅读它们以及其他资源:
-
二进制浮点数 http://csharpindepth.com/Articles/General/FloatingPoint.aspx(浮动/双)
-
十进制浮点数 http://csharpindepth.com/Articles/General/Decimal.aspx(十进制)
当然,所有浮点类型都有其局限性,但特别是您应该not期望二进制浮点能够准确地表示十进制值,例如 0.1。但它仍然不能表示任何不能用 28/29 十进制数字精确表示的东西 - 所以如果你用 1 除以 3,你当然不会得到确切的答案。
You should also note that the range of decimal
is considerably smaller than that of double
. So while it can have 28-29 decimal digits of precision, you can't represent truly huge numbers (e.g. 10200) or miniscule numbers (e.g. 10-200).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)