截断小数没有舍去
可能重复:
如何将十进制数值四舍五入到小数点后两位(在页面上输出)
我想截断像下面的小数
即
- 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"));