提取双精度数的分数系数

Posted

技术标签:

【中文标题】提取双精度数的分数系数【英文标题】:Extrating the fractional coefficient of a double 【发布时间】:2019-03-04 15:06:07 【问题描述】:

数字 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。

注意:, 是小数点分隔符。

【问题讨论】:

免责声明不是作业,我在问自己是否有一个按位运算可以提供比string GetFractional(double input) => input.ToString("E").Substring(0, input.ToString("E").IndexOf("E")).TrimEnd('0'); 未经测试的结果更好的结果。 你能把预期的输出添加到你的testInputs吗? 如果 x > 0 除以 10 直到值变得小于 0.... 请注意,这里的数组不是您所期望的。逗号将数字分隔为两个不同的值。 This question 可以帮到你 【参考方案1】:

编辑:初始版本不适用于 (-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\tGetFractional(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

【讨论】:

您应该通过转换为int 来解释它的作用以及使用Floor 的原因 谢谢@xdtTransform :)【参考方案2】:

以下是解决此问题的算法方法:

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 直到滑出该范围

【讨论】:

喜欢它。添加 0 删除 0。它循环了一下,但数学很简单。 @xdtTransform 哟,你可以随意取整。我喜欢循环:)

以上是关于提取双精度数的分数系数的主要内容,如果未能解决你的问题,请参考以下文章

1010:计算分数的浮点数值

TextRank——关键词提取

习题4-3 求分数序列前N项和 (15分)

高精度高精度分数

为啥scikit learn的平均精度分数返回nan?

LQ0159 无穷分数计算精度