我正在尝试使用Math.Round
课程,但我遇到了让它按照我的意愿去做的问题。基本上我有以下代码:
double test = 1.675;
double rounded = (double)Math.Round((decimal)test, 2, MidpointRounding.ToEven);
Console.Write(rounded);
Console.ReadKey();
我希望rounded
为1.67,其中1.675向下舍入为1.67。相反,我当前的输出是:
1.68
我认为MidpointRounding.ToEven
强迫它舍入到最近的偶数(.005 - > .000)?
答案 0 :(得分:1)
double test = 1.675;
double rounded = Math.Floor(test * 100) / 100;
Console.WriteLine(rounded);
这符合您的要求。还有什么更具体的吗?
答案 1 :(得分:1)
我认为MidpointRounding.ToEven强迫它舍入到最近的偶数(.005 - > .000)?
你错了。 MidpointRounding.ToEven意味着它将以结果的最后一位数为偶数的方式对您的数字进行舍入。
此处记录了这些内容:http://msdn.microsoft.com/de-de/library/system.midpointrounding(v=vs.110).aspx
这应该解决“为什么这样做”的部分。对于“怎么做,我想要什么”:
使用“AwayFromZero”模式,如果您的值高于零,则减去0.01。 (另见:https://stackoverflow.com/a/5166050/1974021)
答案 2 :(得分:1)
这应该提供所需的舍入结果:
var test = 1.6765;
var roundToDigits = 2;
var multiplier = Math.Pow(10, roundToDigits);
var roundedValue
= Equals((test * multiplier) - (int)(test * multiplier), .5)
? Math.Floor(test * multiplier) / multiplier
: Math.Round(test, roundToDigits, MidpointRounding.AwayFromZero);
结果:
1.6765
舍入为2位数会返回1.68
。1.6765
舍入为3位数会返回1.676
。答案 3 :(得分:0)
我现在无所事事,所以为了好玩,我做到了这一点......
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine((1.675).CustomRound(2));
Console.WriteLine((5.41875).CustomRound(2));
Console.WriteLine((1.67501).CustomRound(2));
Console.WriteLine((1.67499).CustomRound(2));
Console.ReadKey();
}
}
public static class fun
{
//i looked at math.round with ilspy, they do something like this :-p
private static readonly double[] pow;
static fun()
{
int max = 16;
pow = new double[max];
for (int i = 0; i < max; ++i)
pow[i] = Math.Pow(10, i);
}
public static double CustomRound(this double test, int digits)
{
//this seem to be working! :-D
var fun = test * pow[digits+1];
var stuff = Math.Floor(test * pow[digits]) * pow[1];
if ((fun-stuff) == 5)
{
return stuff / pow[digits + 1];
}
else
{
return Math.Round(test, digits, MidpointRounding.AwayFromZero);
}
}
}
}