2009-09-15 85 views
10

如何截斷C#中double值的前導數字,我試過Math.Round(doublevalue,2)但沒有給出require的結果。在Math課程中我沒有找到任何其他方法。截斷C#中double值的數字位數

例如我有價值12.123456789,我只需要12.12。

+3

應該是什麼結果的時候你給12.12890? – rahul 2009-09-15 12:27:28

+0

菲尼克斯**所要求的是你想將它圓化到12.13,還是截斷它到12.12 ...? – awe 2009-09-15 12:32:31

+0

是@awe。多數民衆贊成在 – rahul 2009-09-15 12:33:10

回答

25

編輯:有人指出,這些方法回合值而不是截斷。很難真正截斷double的值,因爲它不是真的在正確的基礎上......但截斷decimal值更加可行。

您應該使用適當的格式字符串,例如customstandard,例如,

string x = d.ToString("0.00"); 

string x = d.ToString("F2"); 

值得意識到,一個雙值本身並不「知道」有多少位小數了。只有當你將它轉換成一個字符串時,它才真正有意義。由於二進制浮點類型的工作方式,使用Math.Round將獲得最接近x.xx00000的雙倍值(如果您明白我的意思),但它幾乎肯定不會是確切值x.xx00000

如果你需要任何東西其他比字符串格式,你應該考慮使用decimal來代替。這個價值究竟代表什麼?

我在.NET中,你可能會發現有用的binary floating pointdecimal floating point文章。

+0

感謝您的答案,我不想在字符串中轉換價值,然後再回到雙倍,我必須存儲價值喜歡。 var newVal = Math.Round(oldValue,2)或其他一些函數。 – Firoz 2009-09-15 12:33:41

+3

@Firoz:字符串並返回double將無法幫助您:如果double不能完全代表「12.34」,那麼您將*獲得額外的小數。很難保存一個只有兩位小數的double。 – 2009-09-15 12:40:45

+0

@Firoz:漢斯是絕對正確的。我在我的答案中加入了幾個鏈接... – 2009-09-15 12:45:58

0

object number = 12.123345534;
string.Format({「0:00」},number.ToString());

15

你有什麼試過?它按預期工作對我來說:

double original = 12.123456789; 

double truncated = Math.Truncate(original * 100)/100; 

Console.WriteLine(truncated); // displays 12.12 
3

此代碼....

double x = 12.123456789; 
Console.WriteLine(x); 
x = Math.Round(x, 2); 
Console.WriteLine(x); 

返回此....

12.123456789 
12.12 

什麼是你想要的結果是不同的?

如果您想保留該值作爲double值,並且在第二個小數點後面的任意數字的小數點後面,而實際上並不是數字的四捨五入,那麼您可以簡單地從數字中減去0.005,這樣就可以進行循環。例如。

double x = 98.7654321; 
Console.WriteLine(x); 
double y = Math.Round(x - 0.005, 2); 
Console.WriteLine(y); 

產生此...

98.7654321 
98.76 
+0

如果x = 12.125那麼他會得到12.13這似乎不是他想要的。編輯 – 2009-09-15 12:42:55

+0

以添加舍入選項 – 2009-09-15 12:45:30

0

如果您正在尋找小數點後有兩個點,而舍入數,下面應該工作

string doubleString = doublevalue.ToString("0.0000"); //To ensure we have a sufficiently lengthed string to avoid index issues 
Console.Writeline(doubleString 
      .Substring(0, (doubleString.IndexOf(".") +1) +2)); 

子的第二個參數是計數,並IndexOf返回到零基礎索引,所以我們必須在添加2個十進制值之前添加一個。

這個答案是假設的價值不應該被四捨五入

2

我敢肯定有更多的東西.netty在那裏,但爲什麼不乾脆: -

double truncVal = Math.Truncate(val * 100)/100; 
double remainder = val-truncVal; 
+1

「十進制」類型可能會降低浮點舍入錯誤的風險。 – 2009-09-15 12:54:49

0

如何:

double num = 12.12890; 
double truncatedNum = ((int)(num * 100))/100.00; 
+0

我做了一些基準測試,這個方法比原來的Math.Truncate快兩倍。感謝分享 – mca 2017-09-04 14:07:01

2

這可以工作(雖然未經測試):

public double RoundDown(this double value, int digits) 
{ 
    int factor = Math.Pow(10,digits); 

    return Math.Truncate(value * factor)/factor; 
} 

然後你只需使用它像這樣:

double rounded = number.RoundDown(2); 
4
double original = 12.123456789; 

double truncated = Truncate(original, 2); 

Console.WriteLine(truncated.ToString()); 
// or 
// Console.WriteLine(truncated.ToString("0.00")); 
// or 
// Console.WriteLine(Truncate(original, 2).ToString("0.00")); 


public static double Truncate(double value, int precision) 
{ 
    return Math.Truncate(value * Math.Pow(10, precision))/Math.Pow(10, precision); 
} 
+1

如果你解釋一下代碼,會更好。 – 2012-11-12 04:33:35

0

對於vb.net使用這個擴展:

Imports System.Runtime.CompilerServices 

Module DoubleExtensions 

    <Extension()> 
    Public Function Truncate(dValue As Double, digits As Integer) 

     Dim factor As Integer 
     factor = Math.Pow(10, digits) 

     Return Math.Truncate(dValue * factor)/factor 

    End Function 
End Module