如有问题,如何使用C#
值n.5
整数n
整数:
1.5 -> 2
2.5 -> 3
-1.5 -> -1
-2.5 -> -2
1.4 -> 1
1.6 -> 2
-1.4 -> -1
-1.6 -> -2
我搜索但C#
,Math.Round
仅支持MidpointRounding.AwayFromZero
和MidpointRounding.ToEven
。也许程序员应该欺骗来围绕正常生活中的数字(不是银行或学术思想......)?
预期结果与Javascript中一样,值n.5始终向上舍入到(+)无限 +∞
答案 0 :(得分:1)
试试这个:)
[TestFixture]
public class TestClass
{
int NumberOfDecimalDigits(double d)
{
var text = Math.Abs(d).ToString();
int integerPlaces = text.IndexOf('.');
int decimalPlaces = text.Length - integerPlaces - 1;
return decimalPlaces;
}
double GetDelta(int numberOfDecimalDigits)
{
var deltaStringBuilder = new StringBuilder();
deltaStringBuilder.Append("1");
for (int i = 0; i < numberOfDecimalDigits; i++)
{
deltaStringBuilder.Append("0");
}
double delta = 1 / double.Parse(deltaStringBuilder.ToString());
return delta;
}
double Round(double value, int digits)
{
if (value > 0)
{
return Math.Round(value, digits, MidpointRounding.AwayFromZero);
}
if (value < 0)
{
var numberOfDecimalDigits = NumberOfDecimalDigits(value);
double delta = GetDelta(numberOfDecimalDigits);
return Math.Round(value + delta, digits, MidpointRounding.AwayFromZero);
}
return value;
}
double Round(double value)
{
if (value > 0)
{
return Math.Round(value, MidpointRounding.AwayFromZero);
}
if (value < 0)
{
var numberOfDecimalDigits = NumberOfDecimalDigits(value);
double delta = GetDelta(numberOfDecimalDigits);
return Math.Round(value + delta, MidpointRounding.AwayFromZero);
}
return value;
}
[Test]
public void TestMethod()
{
Assert.AreEqual(Round(1), 1);
Assert.AreEqual(Round(1.9), 2);
Assert.AreEqual(Round(1.5), 2);
Assert.AreEqual(Round(2.5), 3);
Assert.AreEqual(Round(-1), -1);
Assert.AreEqual(Round(-2.9), -3);
Assert.AreEqual(Round(-1.5), -1);
Assert.AreEqual(Round(-2.5), -2);
Assert.AreEqual(Round(1.4), 1);
Assert.AreEqual(Round(1.6), 2);
Assert.AreEqual(Round(-1.4), -1);
Assert.AreEqual(Round(-1.6), -2);
Assert.AreEqual(Round(-1.55), -2);
Assert.AreEqual(Round(-1.6666), -2);
Assert.AreEqual(Round(-0.9999999), -1);
Assert.AreEqual(Round(-0.001), 0);
Assert.AreEqual(Round(2.35, 1), 2.4);
Assert.AreEqual(Round(-2.35, 1), -2.3);
}
答案 1 :(得分:1)
这是一个通过所有测试用例的版本。
static void Main(string[] args)
{
Round(double.Epsilon, 0);
Round(0-double.Epsilon, 0);
Round(1 + double.Epsilon, 1);
Round(1 - double.Epsilon, 1);
Round(1.5, 2);
Round(2.5, 3);
Round(-1.5, -1);
Round(-2.5, -2);
Round(1.4, 1);
Round(1.6, 2);
Round(-1.4, -1);
Round(-1.6, -2);
}
private static void Round(double v1, int v2)
{
var equal = (MyRound(v1) == v2) ? "==" : "!=";
Console.WriteLine($"Math.Round({v1}) {equal} {v2}, it's {MyRound(v1)}");
}
private static double MyRound(double v1)
{
return (v1 < 0)
? 0 - Math.Round(Math.Abs(v1)-0.1)
: Math.Round(v1, MidpointRounding.AwayFromZero );
}
输出:
Math.Round(4.94065645841247E-324) == 0, it's 0
Math.Round(-4.94065645841247E-324) == 0, it's 0
Math.Round(1) == 1, it's 1
Math.Round(1) == 1, it's 1
Math.Round(1.5) == 2, it's 2
Math.Round(2.5) == 3, it's 3
Math.Round(-1.5) == -1, it's -1
Math.Round(-2.5) == -2, it's -2
Math.Round(1.4) == 1, it's 1
Math.Round(1.6) == 2, it's 2
Math.Round(-1.4) == -1, it's -1
Math.Round(-1.6) == -2, it's -2