如何将两位小数相乘并将结果四舍五入到小数点后两位?
例如,如果公式为41.75 x 0.1,则结果为4.175。如果我在带小数的c#中执行此操作,它将自动舍入到4.18。我想向下舍入到4.17。
我尝试使用Math.Floor,但它只是向下舍入到4.00。这是一个例子:
Math.Floor (41.75 * 0.1);
答案 0 :(得分:36)
Math.Round(...)
函数有一个Enum来告诉它使用什么舍入策略。不幸的是,这两个定义并不完全符合您的情况。
两个中点舍入模式是:
您想要使用的是Floor
并且有一些乘法。
var output = Math.Floor((41.75 * 0.1) * 100) / 100;
output
变量现在应该有4.17。
实际上你也可以写一个函数来获取一个可变长度:
public decimal RoundDown(decimal i, double decimalPlaces)
{
var power = Convert.ToDecimal(Math.Pow(10, decimalPlaces));
return Math.Floor(i * power) / power;
}
答案 1 :(得分:10)
public double RoundDown(double number, int decimalPlaces)
{
return Math.Floor(number * Math.Pow(10, decimalPlaces)) / Math.Pow(10, decimalPlaces);
}
答案 2 :(得分:5)
c#中没有精密地板/西林蛋白的原生支持。
然而,你可以通过乘以数字,最低值来模仿功能,然后除以相同的乘数。
例如
decimal y = 4.314M;
decimal x = Math.Floor(y * 100) / 100; // To two decimal places (use 1000 for 3 etc)
Console.WriteLine(x); // 4.31
不是理想的解决方案,但如果数量很小,则应该有效。
答案 3 :(得分:5)
截至.NET Core 3.0
和即将推出的.NET Framework 5.0
,以下内容有效
Math.Round(41.75 * 0.1, 2, MidpointRounding.ToZero))
答案 4 :(得分:1)
另一个解决方案是从零舍入舍入为零。 它应该是这样的:
static decimal DecimalTowardZero(decimal value, int decimals)
{
// rounding away from zero
var rounded = decimal.Round(value, decimals, MidpointRounding.AwayFromZero);
// if the absolute rounded result is greater
// than the absolute source number we need to correct result
if (Math.Abs(rounded) > Math.Abs(value))
{
return rounded - new decimal(1, 0, 0, value < 0, (byte)decimals);
}
else
{
return rounded;
}
}
答案 5 :(得分:0)
这是我的浮动证明向下滚动。
public static class MyMath
{
public static double RoundDown(double number, int decimalPlaces)
{
string pr = number.ToString();
string[] parts = pr.Split('.');
char[] decparts = parts[1].ToCharArray();
parts[1] = "";
for (int i = 0; i < decimalPlaces; i++)
{
parts[1] += decparts[i];
}
pr = string.Join(".", parts);
return Convert.ToDouble(pr);
}
}
答案 6 :(得分:0)
我发现最好的方法是使用字符串。数学的二元变数往往会把事情弄错,否则。人们正在等待.Net 5.0使这一事实过时。没有小数位是一种特殊情况:您可以使用Math.Floor。否则,我们将数字比所需的数字多一个小数位,然后解析没有最后一位数字的数字以得到答案:
/// <summary>
/// Truncates a Double to the given number of decimals without rounding
/// </summary>
/// <param name="D">The Double</param>
/// <param name="Precision">(optional) The number of Decimals</param>
/// <returns>The truncated number</returns>
public static double RoundDown(this double D, int Precision = 0)
{
if (Precision <= 0) return Math.Floor(D);
string S = D.ToString("0." + new string('0', Precision + 1));
return double.Parse(S.Substring(0, S.Length - 1));
}
答案 7 :(得分:0)
如果您想将任何双精度舍入到特定的小数位,如果是中点并不重要,您可以使用:
public double RoundDownDouble(double number, int decimaPlaces)
{
var tmp = Math.Pow(10, decimaPlaces);
return Math.Truncate(number * tmp) / tmp;
}