如何在C#中检查(通用)数字类型是否为整数或非整数类型?

Ste*_*ris 10 c# generics math

我有一个通用类型T.使用Marc的Operator课程,我可以对它进行计算.

是否可以通过计算来检测类型是整数还是整数

也许有更好的解决方案?我更愿意支持任何可能的类型,所以我想防止硬编码哪些类型是整数/非整数.

背景信息

我发现自己的情况是我想要转换doubleT但是舍入到最接近值Tdouble值.

int a = (int)2.6导致2我希望它导致它3,而不知道类型(在这种情况下int).也可能是double,在这种情况下,我希望结果如此2.6.

Chr*_*ris 6

你试过Convert.ChangeType吗?就像是:

Convert.ChangeType(1.9d, typeof (T))
Run Code Online (Sandbox Code Playgroud)

它适用于我认为的所有数字类型(只要第一个参数是iConvertible,类型是支持的,所有基本数字应该是我相信的).

重要的是要提到这将调用像double.ToInt32这样的方法来舍入值而不是截断(我相信银行家四舍五入).

我在一个小的LinqPad程序中测试了它,它做了我认为你想要的:

void Main()
{
    var foo = RetNum<decimal>();
    foo.Dump();
}

public static T RetNum<T>()
{
    return (T)Convert.ChangeType(1.9d, typeof (T));
}
Run Code Online (Sandbox Code Playgroud)

  • 在这里,我正在编写一个通用方法来完成"ChangeType"的功能.+1. (2认同)

Dav*_*Yaw 2

我不是 100% 确定你在问什么,但是:

要检查它是否是整型请使用:if (obj is float || obj is double),或if typeof(T) == typeof(float) || typeof(T) == typeof(double))

要检查它是否是整数值,请将其转换为双精度值,然后执行if(value == Math.Round(value))

当然,这是假设您首先有一个数字。我相信您使用的 Operator 类支持 DateTime 等内容。让您的通用方法具有通用约束会更好吗where T : IConvertible?这样就有了明确的ToDouble方法ToInteger

编辑

我想我明白:你有两个局部变量,double d; T num;. 您想要强制转换d为 type T,但要适当舍入 ifT是整型。那是对的吗?

假设这是正确的,这就是我要做的:

public void SomeMethod<T>()
{
    double d;
    // I think I got all the floating-point types. There's only a few, so we can test for them explicitly.
    if(typeof(T) != typeof(double) && typeof(T) != typeof(float) && typeof(T) != typeof(Decimal))
    {
        d = Math.Round(d);
    }
    T converted = Convert.ChangeType(d, typeof(T));
}
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的吗:您有一个双精度数,并且想要将其转换为“T”,但如果“T”是整数类型,则进行适当的舍入?请参阅编辑。 (2认同)