所以我试图对小数进行未经检查的转换(用作任何数字的“持有者”,可以是整数,可以是浮点数等)。C# 的问题是,在将小数转换为整数类型时,它不允许溢出,即使溢出是可以接受和预期的。未经检查的上下文仅适用于整数类型,不适用于小数,因此我正在寻找实现此目的的最佳方法。
这是我目前的方法(以Int32为例),如果您有任何建议,请写下来。
private static int ToInt32(decimal value)
{
if (value is < int.MinValue or > int.MaxValue)
{
decimal range = 1L + int.MaxValue - int.MinValue;
value = ((((value - int.MinValue) % range) + range) % range) + int.MinValue;
}
return (int)value;
}
Run Code Online (Sandbox Code Playgroud)
有了这个,如果我尝试转换2731498700m为 Int32,我会得到-1563468596(而不是 OverflowException),这正是我想要的。
这是迄今为止我发现的最快的方法,基于Decimal.ToInt32的来源
private static int ToInt32(decimal value)
{
Span<int> buffer = stackalloc int[4];
decimal.GetBits(decimal.Truncate(value), buffer);
return buffer[3] < 0 ? -buffer[0] : buffer[0];
}
Run Code Online (Sandbox Code Playgroud)
发现了一个更好的方法:
private static int ToInt32_1(decimal value)
=> (int)(Int128)value;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |