【问题标题】:How do I truncate a value to a certain number of decimal places? [closed]如何将值截断到一定的小数位数? [关闭]
【发布时间】:2018-12-17 19:23:41
【问题描述】:

我必须使用这个:

double trunc(double nummber, int position);

我的程序应该给出双精度 nummber 减去位置值,如下所示:

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

我该怎么写?

【问题讨论】:

  • 您是否只想显示 x 位小数?
  • 这是作业吗(如果是,请在帖子中包含)?您是否被分配编写Truncate 函数?顺便说一句,按照惯例,公共方法名称在 C# 中以大写字母开头(它们不是必须的,但这是预期的)。
  • Math.Round(3.14159,2)
  • 你看过Math.Truncate。如果你将它与前乘和后除以 10 的幂相结合,你可能有一个解决方案。
  • @Bidou 舍入!= 截断

标签: c# floating-point


【解决方案1】:

这是一种行之有效的方法。您可以像我一样为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

【讨论】:

  • 非常感谢。我不知道大于 9 的 int 应该是 long 。再次感谢您
  • 一个整数可以多一点 +/- 20 亿(即 2,000,000,000)。那有9个零。我将decimalPlaces 乘以10,所以如果decimalPlaces 变得太大,multiplier 将溢出
  • @ahmet:如果您要经常这样做,请创建一个int(或long)可能的乘数数组,并根据需要提取正确的值(而不是每次计算)。如果您即时执行此操作(此处没有任何意义),则称为 memorization (en.wikipedia.org/wiki/Memoization)
【解决方案2】:

如果你想四舍五入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);
}

【讨论】:

  • 我实际上希望用户决定要截断多少。我想过为 int 位置和双数做一个 ReadLine 函数。控制台会将截断后的数字返回给我。
猜你喜欢
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 2018-04-12
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多