如何将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
相关产品推荐
相关产品推荐

