2011-04-15 101 views
0

将像“129.70”这样的字符串转换为整数(在本例中为12970)时出现了一些问题。这是我写的函数:将字符串转换为整数和精度损失

public static int valToInt(string v) 
{ 
    int tmp = (int)(double.Parse(v, new System.Globalization.CultureInfo("en-US")) * 1000); 
    return tmp/10; 
} 

我做了* 1000,然后/ 10招解决这样的问题,和它的作品的时代以及99%,但129.70似乎是一个临界值,并转换为12969. 有没有办法做转换没有任何损失?作为金钱的价值,将不会超过两位小数位...

+6

使用十进制。它也有Parse()方法,不会失去精度。 – Stefan 2011-04-15 12:38:58

+0

无论何时处理货币值,都使用'decimal'而不是'double' - 它在后台存储为10位数字,因此从二进制表示转换时不会有任何损失。 – 2011-04-15 12:40:26

+0

decimal.Parse(“129.70”)= 12970,没关系。 decimal.Parse(“5”)= 5 ...虽然这不是很好:) – kaharas 2011-04-15 12:46:56

回答

2
public static int valToInt(string v) 
{  
    return (int)(Decimal.Parse(v, new System.Globalization.CultureInfo("en-US")) * 100m);  
} 

你真的需要一个 “偏移” 诠释?考虑将值留作十进制。

3

为什么不去掉字符串的小数位,然后解析它?

+1

这将是我的解决方案,如果你真的**必须**使用整数。 'stringname.Replace(“。”,“”)'然后解析它为一个Int – 2011-04-15 12:52:43

+0

+1同样在这里 – Sonosar 2011-04-15 12:55:32

0

浮点值不具有固有局限性精度。将它乘以1000不会使它更精确,但它不能完全表示数字。

当您在将其转换为int时截断数字时,您会夸大任何精度损失。如果该值在转换为int之前的值为129699.99999999之前,则只会剔除小数点,最后以129699结束。也可以舍入到正确的值,但整数除法会削减更多数据,给你12969,而不是12970.

只需乘以100,圆形,并转换为int

public static int valToInt(string v) { 
    return (int)Math.Round(Double.Parse(v, new System.Globalization.CultureInfo("en-US")) * 100.0); 
} 
0

尝试货币价值这个公司这么简单......

public static int valToInt(string v) 
{ 
    return int.Parse(v.Replace(".","")); 
}