.net 截断十进制数而不是四舍五入

.net 截断十进制数而不是四舍五入,.net,floating-point,truncate,.net,Floating Point,Truncate,可能重复: 我想截断下面的小数 i、 e 2.229393->2.229 2.22977777->2.229 您可以使用: 或者,您也可以将ToString与N3配合使用 编辑:由于您不需要舍入,因此可以轻松使用: 当然,如果您试图截断舍入误差,这将不起作用,但对于您在示例中给出的值,它应该可以正常工作。请参阅的前两个答案,以了解为什么它有时无法工作的详细信息。您希望输出的格式是什么 如果你对字符串很满意,那么考虑下面的C代码: 结果将是“3.12” 如果您使用的是.NET,此链接可能很有用

可能重复:

我想截断下面的小数

i、 e

  • 2.229393->2.229
  • 2.22977777->2.229
您可以使用:

或者,您也可以将ToString与N3配合使用

编辑:由于您不需要舍入,因此可以轻松使用:


当然,如果您试图截断舍入误差,这将不起作用,但对于您在示例中给出的值,它应该可以正常工作。请参阅的前两个答案,以了解为什么它有时无法工作的详细信息。

您希望输出的格式是什么

如果你对字符串很满意,那么考虑下面的C代码:

结果将是“3.12”

如果您使用的是.NET,此链接可能很有用。

我希望这会有所帮助……但除非您确定所使用的语言和输出格式,否则很难提出合适的解决方案。

尝试以下方法:

decimal original = GetSomeDecimal(); // 22222.22939393
int number1 = (int)original; // contains only integer value of origina number
decimal temporary = original - number1; // contains only decimal value of original number
int decimalPlaces = GetDecimalPlaces(); // 3
temporary *= (Math.Pow(10, decimalPlaces)); // moves some decimal places to integer
temporary = (int)temporary; // removes all decimal places
temporary /= (Math.Pow(10, decimalPlaces)); // moves integer back to decimal places
decimal result = original + temporary; // add integer and decimal places together
它可以写得更短,但更具描述性

编辑:短途:

decimal original = GetSomeDecimal(); // 22222.22939393
int decimalPlaces = GetDecimalPlaces(); // 3
decimal result = ((int)original) + (((int)(original * Math.Pow(10, decimalPlaces)) / (Math.Pow(10, decimalPlaces));

另一个快速解决方案可能是:

>>> float("%.1f" % 1.00001)
1.0
>>> float("%.3f" % 1.23001)
1.23
>>> float("%.5f" % 1.23001)
1.23001

忘掉一切,看看这个

double num = 2.22939393;
num  = Convert.ToDouble(num.ToString("#0.000"));

截断任意数目的小数的函数:

public decimal Truncate(decimal number, int digits)
{
  decimal stepper = (decimal)(Math.Pow(10.0, (double)digits));
  int temp = (int)(stepper * number);
  return (decimal)temp / stepper;
}

这里有一个扩展方法,它不会受到整数溢出的影响(就像上面的一些答案一样)。为了提高效率,它还缓存了一些10的幂

static double[] pow10 = { 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10 };
public static double Truncate(this double x, int precision)
{
    if (precision < 0)
        throw new ArgumentException();
    if (precision == 0)
        return Math.Truncate(x);
    double m = precision >= pow10.Length ? Math.Pow(10, precision) : pow10[precision];
    return Math.Truncate(x * m) / m;
}
static double[]pow10={1e0、1e1、1e2、1e3、1e4、1e5、1e6、1e7、1e8、1e9、1e10};
公共静态双截断(此双x,整数精度)
{
if(精度<0)
抛出新ArgumentException();
如果(精度==0)
返回Math.Truncate(x);
double m=精度>=功率10.长度?数学功率(10,精度):功率10[精度];
返回数学截断(x*m)/m;
}
试试这个

double d = 2.22912312515;
int demention = 3;
double truncate = Math.Truncate(d) + Math.Truncate((d - Math.Truncate(d)) * Math.Pow(10.0, demention)) / Math.Pow(10.0, demention);

这类似于上面的TcKs建议,但使用math.truncate而不是int转换

但是你会明白的

Private Function TruncateToDecimalPlace(byval ToTruncate as decimal, byval DecimalPlaces as integer) as double 
dim power as decimal = Math.Pow(10, decimalplaces)
return math.truncate(totruncate * power) / power
end function

不适用于第二个示例。我只是希望它被截断,而不是四舍五入。只是重申一下:数学+1。数学-1。四舍五入,这并不能解决问题。如果你不把它乘以1000,那么Math.Truncate也不会起作用。Truncate基本上删除末尾的零。没有这样的数学。截短以小数位数为参数。哇,所有这些只是为了缩短一个数字。看起来很多,但它比转换为字符串做的工作要少得多。:)请注意,这样做可能会产生舍入错误。您不应该得到比开始时更多的舍入错误。我认为使用十进制数据类型应该是通用的解决方案。相关问题:我相信汇编指令。trn也会为您这样做。重复的问题没有说明舍入而不截断。虽然类似,但这个问题的关键方面(不要四舍五入)并没有用“重复”来正确回答。投票重新开放。这不是一个重复的问题。我无法在这里发布我的解决方案,因为问题已经解决,所以我在一个类似的线程中发布了它:可能是因为它没有编译。你是用什么语言发展起来的?我刚才在C#中尝试过这个方法,但是我在尝试将一个十进制数乘以一个双精度数时遇到了一个错误。这对运算没有帮助,因为它会对数字进行四舍五入,而不是截断。此外,
“G”
格式的精度说明符用于总位数,而不仅仅是小数位数(这是
“F”
所做的)。这在使用
系统的大数上失败。OverflowException:值对于Int32来说太大或太小这是错误的。原来的帖子希望删节。这会好起来的。2.2296将导致2.23。
double num = 2.22939393;
num  = Convert.ToDouble(num.ToString("#0.000"));
public decimal Truncate(decimal number, int digits)
{
  decimal stepper = (decimal)(Math.Pow(10.0, (double)digits));
  int temp = (int)(stepper * number);
  return (decimal)temp / stepper;
}
static double[] pow10 = { 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10 };
public static double Truncate(this double x, int precision)
{
    if (precision < 0)
        throw new ArgumentException();
    if (precision == 0)
        return Math.Truncate(x);
    double m = precision >= pow10.Length ? Math.Pow(10, precision) : pow10[precision];
    return Math.Truncate(x * m) / m;
}
double d = 2.22912312515;
int demention = 3;
double truncate = Math.Truncate(d) + Math.Truncate((d - Math.Truncate(d)) * Math.Pow(10.0, demention)) / Math.Pow(10.0, demention);
Private Function TruncateToDecimalPlace(byval ToTruncate as decimal, byval DecimalPlaces as integer) as double 
dim power as decimal = Math.Pow(10, decimalplaces)
return math.truncate(totruncate * power) / power
end function