2012-02-17 144 views
1

由於要求我需要一個雙值轉移到小數點後4位非常精確的精度如下:獲取小數位的精確精度從雙在.net 3.5

double myDoubleValue = 50234.9489898997952932; 

從上面的,我需要輸出爲50234.9489我不想在此要求中舍入數字。

我遇到了「Math.Truncate(a * 100)/ 100;」。但真的,我對這種方法不感興趣。

我在尋找更好的方法非常簡單的方法有點像使用String.FormatRegular Expressions

+0

的'double'類型是不精確數字類型。如果你需要_precise_數字,那麼你需要使用'decimal'。 – 2012-02-17 12:41:14

+0

對不起,Regex修改爲處理雙精度不加小數。 – sanguine 2012-02-21 06:25:38

回答

1

沒有正則表達式:

這工作非常罰款任何double組合

using System.Globalization; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     double d = 50234.9489898997952932; 
     char probablyDot = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0]; 
     string[] number = d.ToString().Split(probablyDot); 


     //Console.WriteLine(number[0] + probablyDot + number[1].Remove(4)); 

     Console.WriteLine(number[0] + probablyDot + (number.Length >1 ? (number[1].Length>4? number[1].Substring(0,4):number[1]): "0000")); 
     //Output: 50234.9489 

     Console.ReadKey(); 
    } 
} 
+0

我正在尋找一個非常簡單直接和簡單的代碼。有一個簡單的方法,用1或2行代碼 – venkat 2012-02-17 12:17:05

+0

我的解決方案有兩行:''''''''''''''''。 +數字[1]。刪除(4);'我的方法的_great_缺點是它崩潰,如果你的double沒有至少四位小數。 – 2012-02-17 12:24:20

+0

這很糟糕。由於輸入雙精度值可能有1或2或3或4或5或許多小數。這不應該被固定爲常量。請確保正確回答相同的問題。 – venkat 2012-02-17 12:42:00

2

您需要自己做。一個可能的解決方案是使用擴展方法

public static class DoubleEx 
{ 
    public static double TruncateFraction(this double value, int fractionRound) 
    { 
     double factor = Math.Pow(10, fractionRound); 
     return Math.Truncate(value * factor)/factor; 
    } 
} 

這是如何使用它

double foo = 50234.9489898997952932; 
double bar = foo.TruncateFraction(4); 

Console.WriteLine(foo); //50234.9489898997952932 
Console.WriteLine(bar); //50234.9489 
+1

我剛剛測試過這個方法,它似乎返回1.5553,如果我做'((double)1.5554).TruncateFraction(4)'。我預計它會返回1.5554。 – Mark 2012-02-17 11:59:19

+0

您的方法可能很複雜。但是我期待着一行代碼很簡單。無論如何,謝謝 – venkat 2012-02-17 12:00:42

3
double d = 50234.94895345345345; 
var Expected_result = Double.Parse((Regex.Match(d.ToString(), "[+-]?\\d*.\\d{0,4}")).Value); 
+0

如果你沒有小數點,那麼這不會很好玩。嘗試將第一行更改爲「double d = 1」並查看「p」的含義。 – Mark 2012-02-17 12:06:25

+0

@sanguine:那麼如果得到的結果,如果雙沒有小數位? – venkat 2012-02-17 12:10:42

+0

@Mark:那麼如果double沒有小數位,那麼如何重寫這個正則表達式來得到結果??? – venkat 2012-02-17 12:19:57

0

這裏有很多答案與問題中給出的輸入一起工作,但是用一系列值測試它們時,它們都有侷限性(請參閱註釋)。

我可以看到用任何十進制輸入實現這一點的唯一方法如下。它可能不是一個班輪,但對我來說似乎很強大。

private static string TrimDecimalPlaces(double value, int numberOfDecimalPlaces) 
{ 
    string valueString = value.ToString(); 

    if (!valueString.Contains(".")) return valueString; 

    int indexOfDot = valueString.IndexOf("."); 

    if ((indexOfDot + numberOfDecimalPlaces + 1) < valueString.Length) 
    { 
     return valueString.Remove(indexOfDot + numberOfDecimalPlaces + 1); 
    } 
    return valueString; 
} 

我已經與下面的測試數據來測試此,結果如預期:

  • 1.1
  • 1.11
  • 1.111
  • 1.1111
  • 1.11111
  • 1.111111
  • -1
  • -1.1
  • -1.11
  • -1.111
  • -1.1111
  • -1.11111
  • -1.111111
+0

請以上述最簡單的方式查看「沒有正則表達式:」的答案,我也一樣。 – venkat 2012-02-18 05:55:53