C# 将浮点转换为自定义定点数据类型

C# 将浮点转换为自定义定点数据类型,c#,numbers,bit-manipulation,C#,Numbers,Bit Manipulation,我有一个固定点数据类型: public struct Fixed { public const long SCALE = 1_000_000_000; private readonly long unscaledValue; public static explicit Fixed(double value) { // Halp } public static explicit double(Fixed value) {

我有一个固定点数据类型:

public struct Fixed
{
    public const long SCALE = 1_000_000_000;
    private readonly long unscaledValue;

    public static explicit Fixed(double value)
    {
        // Halp
    }

    public static explicit double(Fixed value)
    {
        // Halp
    }
}
因此,代表5.2,
unscaledValue
将是5200000。

float
s和
double
s转换为my数据类型的最佳方法是什么,反之亦然

你可以这样做

long fix = (long) value * scale;
double value = ((double) fix)/((double)scale);
用于转换为您的类型以及类似的内容

long fix = (long) value * scale;
double value = ((double) fix)/((double)scale);
用于重新转换

但是要注意精度的损失,如果你想乘以你的类型的两个数字,你需要重新缩放操作符或者结果

e、 g


是否必须是基于十进制的定点数据类型?是。我需要数字的精确表示,如0.1、0.01…为什么要在
十进制上使用此值呢?但是既然
0.1
不能精确表示为
双精度
,我看不到正确转换它的机会。
decimal
不是一个选项吗?复制decimal的源代码。当我将价值观设定为long时,我将所有信息都从dacimal点释放出来。此外,将修正值转换为双精度可能会导致溢出。