提取双精度分数系数

时间:2019-03-04 15:06:07

标签: c#

数字170可以用以下形式表示为规范化形式:
 1.7作为分数系数
 指数为+2,以10为底。

  

170 = 1,7×10 + 2

有没有一种方法可以数学方式提取“分数系数”? 不使用字符串表示形式。

var testInputs = 
    new double[] {
        1.7E+1,     // 17
        1.7E+2,     // 170
        1.7E+3,     // 1700

        -1.7E+1,    // -17
        -1.7E+2,    // -170
        -1.7E+3,    // -1700

        1.7E-1,     // 0,17
        1.7E-2,     // 0,017
        1.7E-3,     // 0,0017

        -1.7E-1,    // -0,17
        -1.7E-2,    // -0,017
        -1.7E-3,    // -0,0017
    };

那些检验的分数系数的绝对值为:1,7。

Nb:,是小数点分隔符。

2 个答案:

答案 0 :(得分:5)

编辑:初始版本不适用于(-1<x<1)

如果我的查询正确无误...

var X = -1.7; 
var Y = (decimal)X/(decimal)(Math.Pow(10, (int)Math.Log10(Math.Abs(X))-(X<1 && X > -1?1:0)))

测试:

var inputs = new[] { 1700,170,17,1.7,0.17,0.017,0.0017,
                    -1700, -170, -17, -1.7, -0.17, -0.017, -0.0017 };

decimal  GetFractional(decimal X) =>
    (decimal)X/(decimal)(Math.Pow(10, (int)Math.Log10(Math.Abs(X))-(X<1 && X > -1?1:0)));

foreach (var x in inputs) 
{ 
    WriteLine($"{x,7}\t\t{GetFractional(x)}"); 
}

结果:

1700        1,7
 170        1,7
  17        1,7
 1,7        1,7
0,17        1,7
0,017       1,7
0,0017      1,7
-1700       -1,7
-170        -1,7
 -17        -1,7
-1,7        -1,7
-0,17       -1,7
-0,017      -1,7
-0,0017     -1,7

答案 1 :(得分:1)

这将是一种解决此问题的算法方法:

public double ExtractFraction(double value)
{
    if (value == 0) return value;

    if (value > 10 || value < -10)
    {
        while (value > 10 || value < -10)
        {
            value /= 10.0;
        }
    }
    else if (value < 1 || value > -1)
    {
        while (value < 1 && value > -1)
        {
            value *= 10.0;
        }
    }
    return value;
}

说明:如果该值超出] 10 -10 [的范围,则需要除以10,直到在该范围内滑动

如果该值在] 1 -1范围内,则需要乘以10,直到滑出该范围