2013-01-13 29 views
-4

可以说我有double 42.433243,我想将其转换为整数42433243.C#双整数

是什么做的,当小数长度是随机的代码?

进一步的例子:

45.25 => 4525 

125.152254 => 125152254 

etc... 
+0

不担心溢出? – Oded

+0

你有什么代码? –

+2

'12.1'你想要什么? 121或1210或12100 .... – I4V

回答

6

可以,只要有任何小数部分乘以10的值:

Decimal m = 42.433243m; 

while (m % 1 != 0) m *= 10; 
int i = (int)m; 
+0

这是一种新颖的方式:) – Matt

+0

'42.4332430m'呢? – I4V

+0

@Matt没有什么新奇的,这是你应该如何理想地处理它,除了精度麻烦,你会最终。双打转换为整数等其他类型是危险的。 – nawfal

2

快速和肮脏的:

double x = 42.25; 
int big = int.Parse(x.ToString().Replace(".","")); 

如果数目太大,这不工作(如溢出,大于2^32 int或你可以在第2行替换intdouble,并将其扩大)。

让我知道你是否有其他的考虑。

+0

不错。击败我,甚至更优雅一点。 – krillgar

+0

如果你的系统的小数点分隔符不是'.',那么它不起作用......并且,将一个数字转换为一个字符串并返回一个数字总是相当不雅。 –

+0

这简直太简单了......我正在推翻这个:) – Matt

0
int result = Convert.ToInt32(Regex.Match(digits.Replace(".","").Replace(",",""), @"^\d+$").Value); 
+0

如果小数点分隔符既不是','也不是''。另外,将一个数字转换为一个字符串并返回一个数字总是相当不雅。此外,这个答案缺乏解释。 –

1

也许类似这样的工作。

while ((double_num - Math.floor(double_num)) != 0.0) double_num *= 10; 
int num = (int) double_num; 
0

更直接的方法是将数字转换为decimal并检查这些位。

前96个最低有效位代表尾数,而32个最高有效位代表指数。所以你感兴趣的实际值是32个最低有效位。 Decimal.GetBits()方法以位数组的形式返回位,因此您只需要获取数组中的第一个int即可。只要数字不超过int.MaxValue,你就是金。

var number = 42.433243; 
var asDecimal = (Decimal)number; 
var bits = Decimal.GetBits(asDecimal); 
var digits = bits[0]; // 42433243