将String转换为Int和精度损失

时间:2011-04-15 12:37:48

标签: c#

将“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。 有没有办法在没有任何损失的情况下进行转换?作为货币价值,不会超过两位小数......

5 个答案:

答案 0 :(得分:3)

为什么不从字符串中删除小数位,然后解析呢?

答案 1 :(得分:2)

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

你真的需要一个“偏移”int吗?考虑将值保留为十进制。

答案 2 :(得分:0)

我已经阅读了大量关于'为什么'整数和双精度比小数更精确'的评论,但简短的回答是使用小数。有关原因的一些参考:

  1. http://msdn.microsoft.com/en-us/library/364x0z75%28v=vs.80%29.aspx
  2. http://msdn.microsoft.com/en-us/library/yht2cx7b%28v=vs.80%29.aspx

答案 3 :(得分: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);
}

答案 4 :(得分:0)

试试这么简单......

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