You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将C#的System.Double转换为无标度值及对应标度?

如何从C# double类型值获取无标度表示与对应标度?

给定如下C# double类型值:

double value = 123.456;

我需要获取该值的无标度表示(即123456)及对应标度(即3)。

用decimal类型实现这个需求很简单,因为它并非IEEE-754浮点实现,但对于double和float类型来说难度要大得多。

目前我已经实现了获取符号、指数和尾数的方法,但不知道如何利用这些值得到无标度值与标度:

private static int GetSign(double value)
{
    long bits = BitConverter.DoubleToInt64Bits(value);
    return bits >> 63 == 0 ? 1 : -1;
}

private static int GetExponent(double value)
{
    long bits = BitConverter.DoubleToInt64Bits(value);
    return (int)((bits >> 52) & 0x7FF) - 1023;
}

private static long GetMantissa(double value)
{
    long bits = BitConverter.DoubleToInt64Bits(value);
    return bits & 0xFFFFFFFFFFFFF;
}

(当然,这些方法可以简化为传入bits参数,不用每次都从double值转换获取)


针对Sweeper的评论:

那么你是否认为double value = 123.4560的无标度值为1234560、标度为4?若是则无法实现,因为123.456与123.4560作为double类型是同一值,但123.456m与123.4560m是不同的。

我的回应:可以忽略无意义的尾随零,也就是说123.4560的标度仍应为3。

针对Sweeper的第二条评论:

这不仅是“无意义尾随零”的问题。123.456000000000003与123.456的double表示也相同,其精确值为123.456000000000003069544618484。你确定要获取该值的无标度形式吗?

我做了如下测试:

double a = 123.456;
double b = 123.456000000000003069544618484;
        
Console.WriteLine(a); // 123.456
Console.WriteLine(b); // 123.456

这种情况下,.NET为什么在打印值时会忽略尾随零和额外数字?(我不希望得到123456000000000003069544618484这样的无标度值。)


内容的提问来源于stack exchange,提问作者Matthew Layton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:47:49