从double获取小数部分

我想要以整数forms接收小数点后面的数字。 例如,从1.05或从2.50只有05只有50 不是 0.50

更新的答案

我在这里给3种方法。

[1]使用Math.Truncate的math解决scheme

  var float_number = 12.345; var result = float_number - Math.Truncate(float_number); 

//input:1.05
//输出:“0.050000000000000044”

//input:10.2
//输出:0.19999999999999929

如果这不是你期待的结果,那么你必须将结果改为你想要的forms(但是你可能会再次进行一些string操作)。

[2]使用乘数[N是10的倍数(例如10 2或10 3),其中N是小数位数]

  // multiplier is " 10 to the power of 'N'" where 'N' is the number // of decimal places int multiplier = 1000; double double_value = 12.345; int double_result = (int)((double_value - (int)double_value) * multiplier); 

//输出345

如果小数位数不是固定的,那么这种方法可能会产生问题。

[3]使用“正则expression式(REGEX)”

用string编写解决scheme时,我们应该非常小心。 除了一些情况,这不是可取的

如果你打算用小数点进行一些string操作,那么这将是可取的

  string input_decimal_number = "1.50"; var regex = new System.Text.RegularExpressions.Regex("(?<=[\\.])[0-9]+"); if (regex.IsMatch(input_decimal_number)) { string decimal_places = regex.Match(input_decimal_number).Value; } 

//input:“1.05”
//输出:“05”

//input:“2.50”
//输出:“50”

//input:“0.0550”
//输出:“0550”

你可以在http://www.regexr.com/find关于Regex的更多信息。;

最好的方法是:

 var floatNumber = 12.5523; var x = floatNumber - Math.Truncate(floatNumber); 

结果你可以转换,但你喜欢

 var decPlaces = (int)(((decimal)number % 1) * 100); 

这假定你的号码只有两位小数。

更好的方法 –

  double value = 10.567; int result = (int)((value - (int)value) * 100); Console.WriteLine(result); 

输出 –

 56 

最简单的变体是Math.truncate()

 double value = 1.761 double decPart = value - Math.truncate(value) 

没有舍入问题的解决scheme:

 double number = 10.20; var first2DecimalPlaces = (int)(((decimal)number % 1) * 100); Console.Write("{0:00}", first2DecimalPlaces); 

产出: 20

请注意,如果我们没有转换成十进制,它会输出19

也:

  • 产出318.4040 (而不是39
  • 47.612345输出: 61 (而不是47.612345
  • 对于3.01输出: 01 (而不是1

如果您正在使用财务数据,例如,如果您正在尝试获取交易金额的美分部分,则始终使用decimal数据types。

更新:

如果将其作为string处理(build立在@ SearchForKnowledge的答案上),以下方法也将起作用。

 10.2d.ToString("0.00", CultureInfo.InvariantCulture).Split('.')[1] 

然后可以使用Int32.Parse将其转换为int。

 int last2digits = num - (int) ((double) (num / 100) * 100); 
  public static string FractionPart(this double instance) { var result = string.Empty; var ic = CultureInfo.InvariantCulture; var splits = instance.ToString(ic).Split(new[] { ic.NumberFormat.NumberDecimalSeparator }, StringSplitOptions.RemoveEmptyEntries); if (splits.Count() > 1) { result = splits[1]; } return result; } 

这是我为类似情况写的一个扩展方法。 我的应用程序将收到格式为2.3或3.11的数字,其中数字的整数部分代表年份,小数部分代表月份。

 // Sample Usage int years, months; double test1 = 2.11; test1.Split(out years, out months); // years = 2 and months = 11 public static class DoubleExtensions { public static void Split(this double number, out int years, out int months) { years = Convert.ToInt32(Math.Truncate(number)); double tempMonths = Math.Round(number - years, 2); while ((tempMonths - Math.Floor(tempMonths)) > 0 && tempMonths != 0) tempMonths *= 10; months = Convert.ToInt32(tempMonths); } } 
 var result = number.ToString().Split(System.Globalization.NumberDecimalSeparator)[2] 

以string的forms返回它(但你总是可以把它转换回int),并假设这个数字有一个“。”。 某处。

您可以删除点. 从double你试图得到使用Remove()函数的小数转换之后,双重string,以便您可以执行所需的操作

考虑有一个double 0.667810.66781 ,下面的代码将只显示点后面的数字. 这是66781

 double _Double = 0.66781; //Declare a new double with a value of 0.66781 string _Decimals = _Double.ToString().Remove(0, _Double.ToString().IndexOf(".") + 1); //Remove everything starting with index 0 and ending at the index of ([the dot .] + 1) 

另一个scheme

您也可以使用Path类,以跨平台的方式对string实例进行操作

 double _Double = 0.66781; //Declare a new double with a value of 0.66781 string Output = Path.GetExtension(D.ToString()).Replace(".",""); //Get (the dot and the content after the last dot available and replace the dot with nothing) as a new string object Output //Do something 

这很简单

  float moveWater = Mathf.PingPong(theTime * speed, 100) * .015f; int m = (int)(moveWater); float decimalPart= moveWater -m ; Debug.Log(decimalPart); 

使用正则expression式: Regex.Match("\.(?\d+)")有人纠正我,如果我在这里错了

为什么不使用int y = value.Split('.')[1];

Split()函数将该值分割为单独的内容,并且1在输出第二个值之后.