C# 如何改进此算法以更正数字流的十进制位置
对于以下问题,我如何改进以下算法 接收到一个数字流 在流中的某个点,小数点位于错误位置的数字开始到达 一段时间后,错误消失,正确的值进入流 我怎样才能更正小数点位置错误的数字 请注意,不正确的数字并不是精确的十的倍数。以下是示例流: 可以假设数字总是大于零,并且一个值与下一个值之间的差值小于50%C# 如何改进此算法以更正数字流的十进制位置,c#,C#,对于以下问题,我如何改进以下算法 接收到一个数字流 在流中的某个点,小数点位于错误位置的数字开始到达 一段时间后,错误消失,正确的值进入流 我怎样才能更正小数点位置错误的数字 请注意,不正确的数字并不是精确的十的倍数。以下是示例流: 可以假设数字总是大于零,并且一个值与下一个值之间的差值小于50% 11.111 11.112 11.113 1111.4 // wrong 1111.5 // wrong 11.116 11.117 0.000011111 0.000011112 0.00001
11.111
11.112
11.113
1111.4 // wrong
1111.5 // wrong
11.116
11.117
0.000011111
0.000011112
0.000011113
111.14 // wrong
111.15 // wrong
0.000011116
0.000011117
0.000011111
0.000011112
0.000011113
0.0011114 // wrong
0.0011115 // wrong
0.000011116
0.000011117
下面是我想要改进的代码:
static double lastValue = -1;
static void OnValue(double value) {
if (value <= 0)
return;
if (lastValue != -1) {
var tooHigh = lastValue * 9.5;
var tooLow = lastValue * 0.15;
while (value >= tooHigh)
value /= 10;
while (value <= tooLow)
value *= 10;
}
lastValue = value;
// process value
}
假设来源是
IEnumerable<Double> source = ...
您可以使用Linq检查和更正小数点:
// Power we're looking for
int power = 0;
var result = source.Select((v, index) => {
Double p;
if (index <= 0) {
if (v == 0)
power = 1; // <- if 0 is the first number I assume x.yz... is the answer
else {
p = Math.Log10(Math.Abs(v));
power = p < 0 ? (int) (p - 0.5) : (int) (p + 0.5);
}
return v;
}
if (v == 0) // <- Nothing can be done with zero...
return v;
p = Math.Log10(Math.Abs(v));
var actual = p < 0 ? (int) (p - 0.5) : (int) (p + 0.5);
if (actual == power)
return v;
else
return v * Math.Pow(10.0, power - actual);
});
定义我的对与错,你很可能已经解决了问题。你是在招聘员工,还是只是在为你的家庭作业寻找免费答案?说真的,你必须先付出一点努力,然后当你碰到一堵虚拟的墙时,用你目前为止所拥有的和我们特别的关键点回来,任何人都可以写一些有用的东西。我希望它真的很快,并希望从比我聪明的人那里得到一些灵感:请展示一些代码,让我检查一下Hi Dmitry:酷代码。。。它快吗?+1因为我看得越多我就越喜欢它哈哈