如何将值截断为一定的小数位数?

时间:2018-12-17 19:23:42

标签: c# floating-point

我必须使用这个:

double trunc(double nummber, int position);

并且我的程序应该给双nummber减去位置值,像这样:

Console.Write(trunc(3.14159,2));  // 3.14

我怎么写呢?

2 个答案:

答案 0 :(得分:0)

这是一种有效的方法。您可以像我一样为doubledecimal(或两者)做到这一点。我手动计算“乘数”,因为我怀疑少量整数乘法会比使用Math.Pow更快。但是,对于每个人自己:

 public static double Truncate(double value, int decimalPlaces)
 {
     var multiplier = 1;
     for (var i = 0; i < decimalPlaces; ++i)
     {
         multiplier *= 10;       //this makes sense if integer multiplication is faster than Math.Pow(), if not...
     }

     return Math.Truncate(multiplier * value) / multiplier;
 }

您可能还想检查decimalPlaces整数是否为非负数且不大于9(否则它将溢出int)。如果您希望使用9位以上的数字,则需要将multiplier设为long

答案 1 :(得分:0)

如果您想舍入最多2个小数点:f2格式字符串就足够了

Console.Write($"{3.14159:f2}"); 

如果要截断2个小数点:我们必须将(* 100)截断为整数并缩小(/ 100) 。最后,如果发生舍入错误(例如f2),3.13999999格式

Console.Write($"{Math.Truncate(3.14159 * 100) / 100:f2}");

如果您想实现trunc,则具有相同的想法(缩放,截断,缩减):

static double trunc(double nummber, int position) {
  return Math.Truncate(nummber * Math.Pow(10.0, position)) / Math.Pow(10.0, position);
}