簡體   English   中英

將String轉換為Int和精度損失

[英]Convert String to Int and precision loss

將“ 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。有沒有辦法進行轉換而無需有什么損失嗎? 作為貨幣值,最多只能有兩個十進制數字...

為什么不從字符串中去除小數位然后解析呢?

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

您真的需要一個“偏移”整數嗎? 考慮將值保留為十進制。

我已經讀了很多關於“為什么”的整數和雙精度數不如十進制精確的評論,但是簡單的答案是使用十進制。 有關為什么的一些參考:

  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

浮點值確實具有精度限制。 將其乘以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);
}

試試這個很簡單...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM