如何截斷C#中double值的前導數字,我試過Math.Round(doublevalue,2)但沒有給出require的結果。在Math課程中我沒有找到任何其他方法。截斷C#中double值的數字位數
例如我有價值12.123456789,我只需要12.12。
如何截斷C#中double值的前導數字,我試過Math.Round(doublevalue,2)但沒有給出require的結果。在Math課程中我沒有找到任何其他方法。截斷C#中double值的數字位數
例如我有價值12.123456789,我只需要12.12。
編輯:有人指出,這些方法回合值而不是截斷。很難真正截斷double
的值,因爲它不是真的在正確的基礎上......但截斷decimal
值更加可行。
您應該使用適當的格式字符串,例如custom或standard,例如,
string x = d.ToString("0.00");
或
string x = d.ToString("F2");
值得意識到,一個雙值本身並不「知道」有多少位小數了。只有當你將它轉換成一個字符串時,它才真正有意義。由於二進制浮點類型的工作方式,使用Math.Round
將獲得最接近x.xx00000
的雙倍值(如果您明白我的意思),但它幾乎肯定不會是確切值x.xx00000
。
如果你需要任何東西其他比字符串格式,你應該考慮使用decimal
來代替。這個價值究竟代表什麼?
我在.NET中,你可能會發現有用的binary floating point和decimal floating point文章。
感謝您的答案,我不想在字符串中轉換價值,然後再回到雙倍,我必須存儲價值喜歡。 var newVal = Math.Round(oldValue,2)或其他一些函數。 – Firoz 2009-09-15 12:33:41
@Firoz:字符串並返回double將無法幫助您:如果double不能完全代表「12.34」,那麼您將*獲得額外的小數。很難保存一個只有兩位小數的double。 – 2009-09-15 12:40:45
@Firoz:漢斯是絕對正確的。我在我的答案中加入了幾個鏈接... – 2009-09-15 12:45:58
object number = 12.123345534;
string.Format({「0:00」},number.ToString());
你有什麼試過?它按預期工作對我來說:
double original = 12.123456789;
double truncated = Math.Truncate(original * 100)/100;
Console.WriteLine(truncated); // displays 12.12
此代碼....
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
如果x = 12.125那麼他會得到12.13這似乎不是他想要的。編輯 – 2009-09-15 12:42:55
以添加舍入選項 – 2009-09-15 12:45:30
如果您正在尋找小數點後有兩個點,而舍入數,下面應該工作
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個十進制值之前添加一個。
這個答案是假設的價值不應該被四捨五入
我敢肯定有更多的東西.netty在那裏,但爲什麼不乾脆: -
double truncVal = Math.Truncate(val * 100)/100;
double remainder = val-truncVal;
「十進制」類型可能會降低浮點舍入錯誤的風險。 – 2009-09-15 12:54:49
如何:
double num = 12.12890;
double truncatedNum = ((int)(num * 100))/100.00;
我做了一些基準測試,這個方法比原來的Math.Truncate快兩倍。感謝分享 – mca 2017-09-04 14:07:01
這可以工作(雖然未經測試):
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);
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);
}
如果你解釋一下代碼,會更好。 – 2012-11-12 04:33:35
對於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
應該是什麼結果的時候你給12.12890? – rahul 2009-09-15 12:27:28
菲尼克斯**所要求的是你想將它圓化到12.13,還是截斷它到12.12 ...? – awe 2009-09-15 12:32:31
是@awe。多數民衆贊成在 – rahul 2009-09-15 12:33:10