从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”
最好的方法是:
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.40
:40
(而不是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.66781
值0.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
在输出第二个值之后.