因此,我正在try 对小数进行Java风格的强制转换(它用作任何数字的"持有符",可以是整数,也可以是浮点数等). C#的问题是,在将DECIMAL转换为INTEGER类型时,它不允许溢出,即使溢出是可以接受和预期的.未选中的上下文只适用于整数类型,而不适用于小数,所以我正在寻找实现这一点的最佳方法.

这是我目前的方法(以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;
    }

这样,如果我try 将2731498700m转换为Int32,我将得到-1563468596而不是Overflow Exception,这正是我想要的.

推荐答案

这是我到目前为止发现的最快的方法,基于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];
}

发现了一种更好的方法:

private static int ToInt32_1(decimal value)
    => (int)(Int128)value;

Csharp相关问答推荐

Blazor:计算值或保留为默认值

ListaryImportProperty的默认DllImportSearchPathsProperty行为

AutoMapper -如何为两个不同的用例设置单个映射?

Blazor:类型或命名空间名称Components在命名空间中不存在''

编写DataAnnotations自定义验证器的多种方法

Unity 2D自顶向下弓旋转

为什么将鼠标悬停在DateTimeOffset上只显示Hour值?

模型绑定RazorPage表单

如何测量在使用UTF8而不是C#中的UTF16编码字符串时内存使用量的增长

在C#中,将两个哈希集连接在一起的时间复杂度是多少?

如何通过寻找向量长度来优化两个循环?

从VS调试器而不是测试资源管理器运行的调试NUnitDotNet测试

使用带有参数和曲面的注入失败(&Q;)

.NET 8 DI GetServices<;对象&>不工作

将内置的OrderedEumable&Quot;类设置为内部类有什么好处?

如何让游戏对象在切换场景时被销毁,但在开始新游戏时重新锁定

未在Windows上运行的Maui项目

如何在特定环境中运行dotnet测试?

SharpZipLib在文件名前加上目录名,生成tar.gz

如何在C#中抽象Vector256;T<;的逻辑以支持不同的硬件配置?