我今天正在玩小数.我注意到了这个:
Decimal.MaxValue
79228162514264337593543950335
Decimal.MaxValue - 0.5m
79228162514264337593543950334
Run Code Online (Sandbox Code Playgroud)
以下代码打印为true.
static void Main(string[] args)
{
decimal d = Decimal.MaxValue - 0.5M;
var b = d % 1 == 0;
Console.WriteLine(b);
}
Run Code Online (Sandbox Code Playgroud)
我确信这背后有一个原因,但我不知道它是什么.
Bev*_*van 11
十进制类型使用96位来存储数字序列(ref),加上符号(1位)和指定小数位的位置的缩放因子.
对于此十进制数:
79228162514264337593543950335
Run Code Online (Sandbox Code Playgroud)
所有96位都用在小数点的左侧 - 没有任何东西可以代表答案的小数部分.所以,它变得圆润了.
如果将数字除以10:
7922816251426433759354395033.5
Run Code Online (Sandbox Code Playgroud)
然后你有几个位可以表示小数部分 - 但只有1/10,没有更精细.
decimal和double/ 之间的关键区别在于float它基于指定小数点位置的小数比例因子; 其他浮动类型基于指定二进制点位置的二进制缩放因子.
| 归档时间: |
|
| 查看次数: |
4611 次 |
| 最近记录: |