【问题标题】:Decimal digit truncating C# [duplicate]截断C#的十进制数字[重复]
【发布时间】:2014-11-10 15:41:04
【问题描述】:

我有一个具有以下值的小数变量

a = 99.9999
b = 88.423766
c = 11.896589

我在这里尝试用 4 个小数点进行转换。

我用过

a = Math.Round(Convert.ToDecimal(a), 4);
b = Math.Round(Convert.ToDecimal(b), 4);
c = Math.Round(Convert.ToDecimal(c), 4);

但是我得到像

这样的值
a = 100
b = 88.4238
c = 11.8966

虽然首选值没有四舍五入,

a = 99.9999
b = 88.4237
c = 11.8965

我怎样才能实现它。

【问题讨论】:

  • @marsh 这个问题要四舍五入,这个问题要截断。
  • Convert.ToDecimal 没有重载,它有两个参数,其中第二个参数是int - 你可能是说Convert.ToDecimal(Math.Round(...)) 你能纠正你的问题,所以代码实际上就是你的正在使用吗?

标签: c#


【解决方案1】:

没有将decimal 截断为N 个小数位的内置函数,但它非常简单:

a = Math.Truncate(a * 10000m) / 10000m;

或作为辅助函数:

public decimal Truncate(decimal d, int n)
{
    // calculate 10^n
    decimal t = (decimal)Math.Pow(10.0,n);

    return Math.Truncate(d * t) / t;
}

或作为扩展方法:

public decimal Truncate(this decimal d, int n)
{
    // calculate 10^n
    decimal t = (decimal)Math.Pow(10.0,n);

    return Math.Truncate(d * t) / t;
}

请注意,Math.TruncateMath.Floor 之间的区别在于对负数的处理。 Math.Truncate 从字面上截断十进制数字,而Math.Floor 返回小于输入的最大整数,因此Math.Truncate(-1.2) 将返回-1,而Math.Floor(-1.2) 将返回-2

【讨论】:

  • 谢谢,这是一个很好的解释。
【解决方案2】:

这将保留 4 位小数并截断其余部分:

a = decimal.Truncate(a*10000)/10000;
b = decimal.Truncate(b*10000)/10000;
c = decimal.Truncate(c*10000)/10000;

【讨论】:

  • 不会的。用-88.423766m试试,结果是-88.4238(不截断)。
  • 糟糕,计算时遗漏了一个零。虽然负值是一个问题......
猜你喜欢
  • 2010-09-24
  • 2010-09-23
  • 2017-06-20
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多