2011-04-15 100 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(".","")); 
}