Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不丢失任何数据的情况下在两种(数字)数据类型之间进行转换?_C#_.net - Fatal编程技术网

C# 如何在不丢失任何数据的情况下在两种(数字)数据类型之间进行转换?

C# 如何在不丢失任何数据的情况下在两种(数字)数据类型之间进行转换?,c#,.net,C#,.net,我需要在各种类型(decimal、int32、int64等)之间进行转换,但我希望确保没有丢失任何数据。我发现普通的Convert方法(包括转换)会在没有警告的情况下截断数据 decimal d = 1.5; int i = (int)d; // i == 1 我想知道是否有convert或TryConvert方法,如果转换正在删除数据,它将抛出或返回false。我怎样才能做到这一点 如果可能的话,我希望在一般意义上这样做,因此我可以在给定两个Type对象和一个object实例(其中运行时类型

我需要在各种类型(decimal、int32、int64等)之间进行转换,但我希望确保没有丢失任何数据。我发现普通的
Convert
方法(包括转换)会在没有警告的情况下截断数据

decimal d = 1.5;
int i = (int)d;
// i == 1
我想知道是否有convert或TryConvert方法,如果转换正在删除数据,它将抛出或返回false。我怎样才能做到这一点

如果可能的话,我希望在一般意义上这样做,因此我可以在给定两个
Type
对象和一个
object
实例(其中运行时类型是convertFrom-Type)的情况下完成这一切。像这样:

object ConvertExact(object convertFromValue, Type convertToType)
{
    if ( ** conversion not possible, or lossy ** )
        throw new InvalidCastException();

    // return converted object
}
与类似,但这里的数字被截断。

这个怎么样:

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(ConvertExact(2.0, typeof(int)));
        Console.WriteLine(ConvertExact(2.5, typeof(int)));
    }

    static object ConvertExact(object convertFromValue, Type convertToType)
    {
        object candidate = Convert.ChangeType(convertFromValue,
                                              convertToType);
        object reverse =  Convert.ChangeType(candidate,
                                             convertFromValue.GetType());

        if (!convertFromValue.Equals(reverse))
        {
            throw new InvalidCastException();
        }
        return candidate;
    }
}

请注意,这并不是完美的-例如,它将很高兴地将2.000m和2.00m转换为2,尽管这样会丢失信息(精度)。不过,它并没有失去任何震级,这对您来说已经足够好了。

谢谢!这一个直接进入代码段库;)