今天我在玩小数。我注意到这一点:
Decimal.MaxValue
79228162514264337593543950335
Decimal.MaxValue - 0.5m
79228162514264337593543950334
以下代码打印 true。
static void Main(string[] args)
{
decimal d = Decimal.MaxValue - 0.5M;
var b = d % 1 == 0;
Console.WriteLine(b);
}
我确信这背后有一个原因,但我不知道它是什么。
十进制类型使用 96 位来存储数字序列(ref http://msdn.microsoft.com/en-us/library/system.decimal.aspx),加上一个符号(1 位)和一个指定小数位位置的比例因子。
对于这个十进制数:
79228162514264337593543950335
所有 96 位都用在小数点左边 - 没有剩下任何东西来表示答案的小数部分。所以,它变得四舍五入。
如果将该数字除以 10:
7922816251426433759354395033.5
然后你就可以用一些位来表示小数部分 - 但只能表示 1/10,没有更精细的了。
之间的主要区别decimal
and double
/float
是它基于一个decimal指定位置的比例因子小数点;其他浮动类型基于binary指定位置的比例因子二进制小数点.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)