誰かが与えられた数字に向かって5で終わる数字を四捨五入するアルゴリズムのためにコードを提供してください(どんな言語でもできますが、.Net言語とVB6を書きますか?与えられた数字に向かって丸めます
RoundTo(double値に向かっ倍、numberOfDigitsBehindCommaをINT)
RoundTo(1.25,1,1)= 1.2 RoundTo(1.25,2,1)= 1.3
RoundTo(1.26,1、 1)= 1.3 RoundTo(1.24,2,1)= 1.2
負の数の解を含めてください。
編集:私の要件について混乱が生じるようですが、結果のコードが満たすべきすべてのアサーションを記入します。私の解決策はそうです。
[TestMethod]
public void RoundTowards()
{
double x=3.44;double y=3.45;double z=4.45;
double a = 3.51; double b = 4.5001; double c = -1.14; double d = -1.15;
var mean=4;
Assert.AreEqual(3.4,x.RoundTowards(mean,1));
Assert.AreEqual(3.5, y.RoundTowards(mean, 1));
Assert.AreEqual(4.4, z.RoundTowards(mean, 1));
Assert.AreEqual(3.5, a.RoundTowards(mean, 1));
Assert.AreEqual(4.5, b.RoundTowards(mean, 1));
mean = 5;
Assert.AreEqual(3.4, x.RoundTowards(mean, 1));
Assert.AreEqual(3.5, y.RoundTowards(mean, 1));
Assert.AreEqual(4.5, z.RoundTowards(mean, 1));
Assert.AreEqual(3.5, a.RoundTowards(mean, 1));
Assert.AreEqual(4.5, b.RoundTowards(mean, 1));
mean = 3;
Assert.AreEqual(3.4, x.RoundTowards(mean, 1));
Assert.AreEqual(3.4, y.RoundTowards(mean, 1));
Assert.AreEqual(4.4, z.RoundTowards(mean, 1));
Assert.AreEqual(3.5, a.RoundTowards(mean, 1));
Assert.AreEqual(4.5, b.RoundTowards(mean, 1));
Assert.AreEqual(Math.Round(-1.1,4),Math.Round(c.RoundTowards(mean, 1),4));
Assert.AreEqual(Math.Round(-1.1,4),Math.Round(d.RoundTowards(mean, 1),4));
mean = -2;
Assert.AreEqual(Math.Round(3.4,4),Math.Round(x.RoundTowards(mean, 1),4));
Assert.AreEqual(Math.Round(3.4,4),Math.Round(y.RoundTowards(mean, 1),4));
Assert.AreEqual(Math.Round(4.4,4),Math.Round(z.RoundTowards(mean, 1),4));
Assert.AreEqual(Math.Round(3.5,4),Math.Round(a.RoundTowards(mean, 1),4));
Assert.AreEqual(Math.Round(4.5,4),Math.Round(b.RoundTowards(mean, 1),4));
Assert.AreEqual(Math.Round(-1.1, 4), Math.Round(c.RoundTowards(mean, 1), 4));
Assert.AreEqual(Math.Round(-1.2, 4), Math.Round(d.RoundTowards(mean, 1), 4));
}
[TestMethod]
public void RoundTowardsTowardZero()
{
double x = 3.45; double y = -3.45;
double a = -3.551; double b = 4.551; double c = 4.5500001; double d = 4.5501;
var mean = 0;
Assert.AreEqual(3.4, x.RoundTowards(mean, 1));
Assert.AreEqual(-3.4, y.RoundTowards(mean, 1));
Assert.AreEqual(-3.6, a.RoundTowards(mean, 1));
Assert.AreEqual(4.6, b.RoundTowards(mean, 1));
Assert.AreEqual(4.5, c.RoundTowards(mean, 1));
Assert.AreEqual(4.6, d.RoundTowards(mean, 1));
}
[TestMethod]
public void Test14_55()
{
Assert.AreEqual((14.55).RoundTowards(9, 1) ,14.5);
Assert.AreEqual((14.55).RoundTowards(15,1), 14.6);
}
[TestMethod]
public void Test14_5499999()
{
Assert.AreEqual((14.54999999).RoundTowards(9, 1) ,14.5);
Assert.AreEqual((14.54999999).RoundTowards(15,1), 14.6);
}
ありがとう!!!
ありがとう、このソリューションは私のものとよく似ていますが、より簡潔です。最後の5つが499999999999または5000000001として格納されている場合は、浮動小数点変数を扱うときによく使用されます。私はこれを、所望の丸め位置よりさらに4つ下の小さな加減算を提供することによって解決した。しかし、これが最善のアプローチであるかどうかは私には分かりません。 – Dabblernl
上記の私の懸念に対処する必要がある場合でも、私はあなたの答えを受け入れました。私はあなたがそれについてコメントする時間を見つけることを願っています。私はあなたのアルゴリズムを変更して、0.5の+/-値を.50001に変更しました。現在、すべてのテストは緑色です。 – Dabblernl
こんにちは、はい、浮動小数点数は扱いにくい獣です。 + 0.50001では、0.499990000に対して不正確な丸めが行われるため、調整係数を追加しません。エラーを許容できない場合は、浮動小数点数を使用しないでください。 10ベースの固定小数点数。 (a、b)のように数字を表し、両方が整数で、数値が(a + b/1000000)であるとします。 –