将小数转换为长整型,同时允许溢出

Iag*_*ool 4 .net c#

所以我试图对小数进行未经检查的转换(用作任何数字的“持有者”,可以是整数,可以是浮点数等)。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),这正是我想要的。

shi*_*ngo 5

这是迄今为止我发现的最快的方法,基于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)

  • 请检查第二个,我认为它可以解决所有这些类型。 (2认同)