C# 提取双精度矩阵的分数系数
数字170可以表示为标准化形式,带有:C# 提取双精度矩阵的分数系数,c#,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,
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
注意:
,
是十进制分隔符 编辑:初始版本不适用于(-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;
}
公共双精度分数(双精度值)
{
如果(值==0)返回值;
如果(值>10 | |值<-10)
{
而(值>10 | |值<-10)
{
数值/=10.0;
}
}
else if(值<1 | |值>-1)
{
while(值<1&&value>-1)
{
数值*=10.0;
}
}
返回值;
}
说明:如果该值超出范围]10-10[需要除以10,直到滑入该范围
如果该值在[1-1]范围内[你需要乘以10,直到你滑出这个范围免责声明不是家庭作业,我在问自己是否有一种按位操作,它比string getfrancial(double-input)=>input.ToString(“E”).Substring(0,input.ToString(“E”).IndexOf(“E”).TrimEnd更好('0')
未测试。能否将预期输出添加到测试输入中?
?如果x>0除以10,直到值小于0……请注意,此处的数组不是预期的数组。逗号将数字分隔为两个不同的值。可能有助于您解释这是什么,以及为什么使用Floor
通过该转换转换为int
谢谢@xdtTransform:)喜欢它。添加0删除0。它循环了一点,但数学很简单。@xdtTransform yo,你可以随心所欲地对它进行四舍五入。我喜欢循环:)
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
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;
}