截断小数没有舍去

可能重复:
如何将十进制数值四舍五入到小数点后两位(在页面上输出)

我想截断像下面的小数

  • 2.22939393 – > 2.229
  • 2.22977777 – > 2.229
double d = 2.22977777; d = ( (double) ( (int) (d * 1000.0) ) ) / 1000.0 ; 

当然,如果你试图截断舍入错误,这将不起作用,但是它应该可以很好地处理你在示例中给出的值。 有关此问题的前两个答案,请参阅有时为什么不起作用的详细信息。

你可以使用Math.Round :

 decimal rounded = Math.Round(2.22939393, 3); //Returns 2.229 

或者您可以使用N3 数字格式的 ToString。

 string roundedNumber = number.ToString("N3"); 

编辑:既然你不想四舍五入,你可以很容易地使用Math.Truncate :

 Math.Truncate(2.22977777 * 1000) / 1000; //Returns 2.229 

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

 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; } 

这是一个扩展方法,不会受到整数溢出(就像上面的答案一样)。 它也caching了一些效率为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; } 

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

VB:但你会明白的

 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 

你想要什么格式的输出?

如果您对string感到满意,请考虑以下C#代码:

 double num = 3.12345; num.ToString("G3"); 

结果将是“3.12”。

如果您使用.NET,则此链接可能会有用。 http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

我希望这有助于……但除非您确定的是您正在使用的语言以及您希望输出的格式,否则很难提出适当的解决scheme。

也许另一个快速解决scheme可能是

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

尝试这个

 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); 

尝试这个:

 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)); 

忘记一切只是看看这个

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