有人可以提供代碼(任何語言都可以,但我寫的.Net語言和VB6)的算法將數字以5結尾給定數字嗎?向給定數字回合
RoundTo(雙精度值,朝加倍,整數numberOfDigitsBehindComma)
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);
}
謝謝!
謝謝,這個解決方案最像我自己的,但更簡潔。它只適用於最後五個存儲爲499999999999或5000000001的情況,這在處理浮點變量時很常見。我通過在理想的舍入位置後面提供了一個小的加/減四個位置來解決這個問題。但我不確定這是否是最好的方法。 – Dabblernl
我接受了你的答案,即使我需要解決上述問題。我希望你會有時間對此發表評論。我改變了你的算法,我把+/-的+/-值改成了.50001。現在所有測試都是綠色的。 – Dabblernl
嗨,是的,浮點數是處理困難的野獸。我不會添加任何調整因素,因爲+ 0.50001會得到0.499990000的不正確舍入。如果你不能容忍任何錯誤,你不應該使用浮點數(因爲它們從來不是確切的),但是例如, 10個鹼基的定點數字,例如將數字表示爲對(a,b),其中兩者都是整數,並且所表示的數值是(a + b/1000000),例如。 –