在.NET中,十进制、浮点和双精度之间有什么区别?
什么时候有人会用这些?
在.NET中,十进制、浮点和双精度之间有什么区别?
什么时候有人会用这些?
当前回答
没有人提到
在默认设置中,Floats(System.Single)和doubles(System.Double)永远不会使用Decimal(System.Decimal)将始终使用溢出检查。
我是说
decimal myNumber = decimal.MaxValue;
myNumber += 1;
引发OverflowException。
但这些并不:
float myNumber = float.MaxValue;
myNumber += 1;
&
double myNumber = double.MaxValue;
myNumber += 1;
其他回答
Double和float可以被整数零除,在编译和运行时都没有异常。小数不能除以整数零。如果你这样做,编译总是会失败。
所有这些类型的问题是存在一定的不精确性而且这个问题可能发生在小的小数上,如下面的例子
Dim fMean as Double = 1.18
Dim fDelta as Double = 0.08
Dim fLimit as Double = 1.1
If fMean - fDelta < fLimit Then
bLower = True
Else
bLower = False
End If
问题:bLower变量包含哪个值?
答案:在32位机器上,bLower包含TRUE!!!
如果我将Double替换为Decimal,bLower包含FALSE,这是一个好答案。
在double中,问题是fMean fDelta=1.09999999999,低于1.1。
注意:我认为同样的问题肯定会出现在其他数字上,因为十进制只是精度更高的双精度,而且精度总是有限制的。
事实上,Double、Float和Decimal对应于COBOL中的二进制十进制!
很遗憾,在.Net中不存在COBOL中实现的其他数字类型
BINARY or COMP like float or double or decimal
PACKED-DECIMAL or COMP-3 (2 digit in 1 byte)
ZONED-DECIMAL (1 digit in 1 byte)
在.Net(c#)中定义十进制、浮点和双精度
您必须将值提到为:
Decimal dec = 12M/6;
Double dbl = 11D/6;
float fl = 15F/6;
并检查结果。
每个占用的字节为
Float - 4
Double - 8
Decimal - 12
浮点7位精度
双精度约为15位
十进制大约有28位精度
如果您需要更好的精度,请使用double而不是float。在现代CPU中,两种数据类型的性能几乎相同。使用浮子的唯一好处是它们占用更少的空间。只有当你有很多人的时候,才有实际意义。
我觉得这很有趣。每个计算机科学家都应该知道浮点运算
我不会重复在其他回答和评论中已经回答的大量好的(和一些坏的)信息,但我会用提示回答您的后续问题:
什么时候有人会用这些?
对计数值使用十进制
测量值使用浮点/双精度
一些示例:
钱(我们是数钱还是量钱?)距离(我们是计算距离还是测量距离?*)分数(我们是计算分数还是衡量分数?)
我们总是数钱,不应该量钱。我们通常测量距离。我们经常计算分数。
*在某些情况下,我称之为名义距离,我们可能确实需要“计算”距离。例如,也许我们正在处理显示到城市距离的国家标志,我们知道这些距离永远不会超过一个十进制数字(xxx.x km)。