Мне было интересно увидеть, как .NET преобразует типы данных Double/Single
в Decimal
, поэтому я начал изучать исходный код структуры типа Decimal, который я натолкнулся на код ниже.Как CLR конвертирует Double/Single to Decimal внутри?
Кажется, что все преобразования других типов реализованы в библиотеке классов фрейма, кроме double/float
, которые обрабатываются с помощью CLR извне.
Итак, в основном вопрос Как CLR делает преобразование?
[MethodImpl(MethodImplOptions.InternalCall)]
public extern Decimal(float value);
[MethodImpl(MethodImplOptions.InternalCall)]
public extern Decimal(double value);
public Decimal(int value)
{
int num = value;
if (num < 0)
{
this.flags = -2147483648;
num = -num;
}
else
{
this.flags = 0;
}
this.lo = num;
this.mid = 0;
this.hi = 0;
}
[CLSCompliant(false)]
public Decimal(uint value)
{
this.flags = 0;
this.lo = (int)value;
this.mid = 0;
this.hi = 0;
}
.
.
.
Как это реализовано в .NET Framework - это большая догадка без исходного кода ... но вы можете проверить, как это реализовано в Mono: https://github.com/mono/mono/blob/master/mcs/class/ corlib/System/Decimal.cs –
Это, вероятно, разлагает число с плавающей точкой, и попытаться сопоставить его с ближайшим десятичным – leppie
@AdrianoRepetti: \t \t [DllImport ("libdec", EntryPoint = "double2decimal")] \t \t частных статический ехЬегпом int double2decimal (out Decimal erg, double val, int digit); – leppie