Другой способ - использовать пользовательскую структуру с явным макетом, который определяет как long
, так и double
со смещением 0. Это эквивалентно union
в C.
Примерно так:
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct DoubleLongUnion
{
[FieldOffset(0)]
public long Long;
[FieldOffset(0)]
public double Double;
}
Тогда используйте это:
var union = new DoubleLongUnion();
union.Double = 1.234d;
var longBytes = union.Long;
Это позволит избежать любого небезопасного кода и должно работать довольно быстро, так как вы выполняете преобразование в стеке.
Я не пробовал / не компилировал это, но я считаю, что это должно работать:)
РЕДАКТИРОВАТЬ
Я только что попробовал это, и это работает. Значение longBytes
выше составляет 4608236261112822104.
Некоторые другие значения:
0d -> 0L
double.NaN -> -2251799813685248L
double.MinValue -> -4503599627370497L
double.MaxValue -> 9218868437227405311L
Вот метод, который делает то, что вы хотите:
public static long DoubleToLong(double d)
{
return new DoubleLongUnion { Double = d }.Long;
}