2010-01-26 30 views
1

在「。」之後,我收到一個最多4位數的小數。我知道這個數字是以毫克爲單位的。在不損失精度的情況下舍入到最佳單位

我必須找到數字的最佳匹配單位(毫克,克,千克)。

了一個例子,如果我收到

編輯

116000000.0000毫克,它會返回116.0000公斤
66990000.0000毫克,它會返回66.9900千克
49000010.0000毫克,這是怎麼回事返回49000.0100克
49000000.0100毫克,它將返回49000000.0100毫克
1001毫克,它會返回1.0010克
1010毫克,它會返回1.0100克
1000毫克,它會返回0.0010公斤
1100毫克,它會返回0.0011千克
135005毫克,這是怎麼回事返回135.0050克
和最後一個樣本10013500毫克,它會返回10.0135千克

我目前使用此代碼,我認爲看/是醜陋,可能會失敗

Dim temp As Decimal 
Dim u = New List(Of Integer)(New Integer() {1, 1000, 1000000}) 
For i = 0 To u.Count - 1 
    temp = CDec(qty/u(i)) 
    If (temp * 10000) - Math.Truncate(temp * 10000) <> 0 AndAlso (temp * 10000) - Math.Truncate(temp * 10000) < 1 Then 
     temp = CDec(qty/u(i - 1)) 
     Exit For 
    End If 
Next 
qty = temp 

有沒有更好/更好的方式做我的工作?

用於精密編輯

的輸入可以是0.0001和最大值之間的任何小數的是一個小數可以在.NET接受

輸出需要被舍入到最佳單元,其具有最多4個「」後面的數字。而不會丟失任何精度

+0

你可能想看看http://stackoverflow.com/questions/808104/engineering-notation-in-c了。 – Leonidas 2010-01-26 16:27:13

+0

的輸入別沒有意義,前3個是整數,但最後有一個小數點? – 2010-01-26 16:29:26

+0

@Ian Quigley,我更新了我的問題 – Fredou 2010-01-26 16:35:21

回答

3

根的數量和選擇合適的一個。

public static decimal FormatDecimal(decimal i) 
    { 
     decimal milli = i; 
     decimal grams = decimal.Round(i/1000m, 4); 
     decimal kilo = decimal.Round(grams/1000m, 4); 

     if (kilo * 1000 * 1000 == milli) 
     { 
      return kilo; 
     } 
     if (grams * 1000 == milli) 
     { 
      return grams; 
     } 
     return milli; 
    } 

,並測試:

public static void FormatDecimalTest() 
    { 
     if (FormatDecimal(116000000.0000m) == 116.0000m) 
      Console.WriteLine("ok1"); 
     if (FormatDecimal(66990000.0000m) == 66.9900m) 
      Console.WriteLine("ok2"); 
     if (FormatDecimal(49000010.0000m) == 49000.0100m) 
      Console.WriteLine("ok3"); 
     if (FormatDecimal(49000000.0100m) == 49000000.0100m) 
      Console.WriteLine("ok4"); 
     if (FormatDecimal(1001m) == 1.0010m) 
      Console.WriteLine("ok5"); 
     if (FormatDecimal(1000m) == 0.0010m) 
      Console.WriteLine("ok6"); 
     if (FormatDecimal(1100m) == 0.0011m) 
      Console.WriteLine("ok7"); 
     if (FormatDecimal(1100m) == 0.0011m) 
      Console.WriteLine("ok8"); 
     if (FormatDecimal(135005m) == 135.0050m) 
      Console.WriteLine("ok9"); 
     if (FormatDecimal(10013500m) == 10.0135m) 
      Console.WriteLine("ok10"); 
    } 

在你的問題,我看你用在各種因素的循環。這裏有一個循環解決方案,可以找到不失精度的第一個因素。

public static decimal FormatDecimal(decimal i) 
    { 
     List<decimal> myFactors = new List<decimal>() 
     { 1000m * 1000m, 1000m}; 

     foreach (decimal conversionFactor in myFactors) 
     { 
      decimal result = decimal.Round(i/conversionFactor, 4); 
      if (result * conversionFactor == i) 
      { 
       return result; 
      } 
     } 

     return i; 
    } 
+0

謝謝,這種方式比我的方式更好 – Fredou 2010-01-26 17:24:08

0

您的樣品不作太多的感覺,但你應該像這樣去:

static string FormatWeight(double value) 
{ 
    if (value > 10000000) return (value/10000000D).ToString("0.#### t"); 
    if (value > 100000) return (value/100000D).ToString("0.#### kg"); 
    if (value > 1000) return (value/1000D).ToString("0.#### g"); 
    return value.ToString("0.#### mg"); 
} 
+0

我會因此而失去精確度,如果我通過1111111.1111,我只會看到1.11,其餘的都在哪裏? – Fredou 2010-01-26 16:26:35

+0

仍然失去精度,我會看到1.1111,輸了0.00001111111,在有1111111.1111的情況下,我必須顯示1111111.1111毫克 – Fredou 2010-01-26 16:30:46

+0

我更新了我的問題 – Fredou 2010-01-26 16:33:45

0

你爲什麼不只是使用IFS?是這樣的:

if (num > 1000000) 
return string.format("{0.####} kg", num/1000000) 

if (num > 1000) 
return string.format("{0.####} g", num/1000); 

return string.format("{0.####} mg", num); 
+0

我會因此而失去精確度,如果我通過1111111.1111,我只會看到1.11,其餘的都在哪裏? – Fredou 2010-01-26 16:28:27

+0

在除數的末尾添加一個D使其成爲雙精度。例如。 1000D – hackerhasid 2010-01-27 15:15:50

0

我不會高於上號做CSTR中,數字符,刪除所有尾隨零,再次計數的數量,並基於字符的數量決定一個單元的串。然後將原始數字除以正確的數值並追加單位。

在做這件事之前,你會想對原件做一個截斷,看看返回的值是否與原件匹配;那麼你只需使用毫克。

大概不會比你的代碼工作得更好,但它可能更易於閱讀。也許。

0

對於轉換實施或使用單元庫,然後格式化結果,你會不會更好?

一些項目herehere,雖然我不能保證任何它的質量...

和Java的一個討論here

0

,所以如果我理解正確的,它帶有一個分數<> 0將保持原樣,並表示毫克任何參數ARG ......這應該是不容易的代碼

If ARG <> Int(ARG) Then 
    ' Return ARG 
Endif 

什麼一小部分應該轉換成最合適的單位(mg,g,dag,kg,t等)。因此,對於這些我們需要以字符串形式查看參數,並從後端計算「0」es,然後從中看到我們可以多少次除以10而不會損失數字精度。

在你的第一個例子中,我們從後端計數6個零點,所以我們可以安全地除以10 ^(6 + 4)得到不超過4個小數位數(這比我們實際需要的更多)。

在你的最後一個例子中,我們從後面數了2個「0」es,所以我們可以安全地除以10 ^(2 + 4)。所以如果「存儲除權」大於等於6,除以10^6並以公斤表示 如果「存儲除權除以5和3之間除以10^3並且以g表示, 3休假爲mg。

希望有所幫助。