2010-08-12 42 views
1

如何在点后取6个数字 - 但没有取整数字?如何在点后取6个数字 - 但没有取整数字?

例如:

102.123456789 => 102.123456

9.99887766 => 9.998877 
在C#的WinForms

thak的预先

+0

所以,你只是想在第六位小数“砍”数字而不是执行任何*舍入形式? – 2010-08-12 12:19:02

+0

我会建议[Math.Round](http://msdn.microsoft.com/en-us/library/75ks3aby.aspx),但你说你想截断不舍入。 – ChrisF 2010-08-12 12:22:44

+2

http://stackoverflow.com/questions/329957/truncate-decimal-number-not-round-off – w69rdy 2010-08-12 12:28:58

回答

5
System.Math.Truncate (102.123456789 * factor)/factor; 

在你的情况的因素是10^6; read more

10

可以使用Math.Truncate方法和10^6乘数:

decimal x = 102.12345689m; 
decimal m = 1000000m; 
decimal y = Math.Truncate(m * x)/m; 
Console.WriteLine(y); // Prints 102.123456 
+0

截断为一个整数 - http://msdn.microsoft.com/en-us/library/c2eabd70.aspx “截取四舍五入到最接近零的整数。” – ChrisF 2010-08-12 12:20:37

+0

@ChrisF的确,我更新了我的答案 – 2010-08-12 12:25:07

+0

@Chris:代码有效。他使用10^6乘法器来解决这个问题 - 实际上相当优雅,比使用字符串更清洁! – 2010-08-12 12:27:24

0

我知道这使用字符串是丑陋的,但认为我把它无论如何:

double x = 9.9887766; 
string[] xs = x.ToString().Split('.'); 
double result = double.Parse(xs[0] + "." + xs[1].Substring(0, Math.Min(xs[1].Length, 6))); 
+0

与我的解决方案类似,但您提供了实际的代码。如果你走这条路线,你可能想先检查一下xs [1]是不是第一个(调用子字符串会通过异常)。同样对于非空值,如果它包含少于6个字符会发生什么。 – 2010-08-12 12:24:47

+0

@保罗 - 是的,在你回答之前,我抓住了第二部分。但是......这是一个非常粗糙的例子。如果OP希望总是检查'xs [1]'是否为空/不存在,那么他可以这样做。 – TheCloudlessSky 2010-08-12 12:27:42

0

可能是一个长篇大论方式,但如何把它变成一个字符串,定位小数点,然后抓住字符串减去小数点后第六位的任何东西。然后你可以把它变成小数。

0

它的原油,但怎么样:

decimal Number = 102.123456789; 
string TruncateTarget = Number.ToString(); 
decimal FinalValue = Decimal.Parse(TruncateTarget.Substring(0, TruncateTarget.IndexOf('.') +6)); 
2
public decimal TruncateDecimal(decimal decimalToTruncate, uint numberOfDecimalPlacse) 
    { 
    decimal multiplication_factor = (decimal)Math.Pow(10.0, numberOfDecimalPlacse); 
    decimal truncated_value = (long)(multiplication_factor * decimalToTruncate); 
    return (truncated_value/multiplication_factor); 
    } 
相关问题