截断C#中double值的位数
如何在C#中截断double值的前导数字,我已经尝试过Math.Round(doublevalue,2)但没有给出require结果。 我没有在Math类中找到任何其他方法。
例如,我的价值为12.123456789,我只需要12.12。
编辑:有人指出,这些方法围绕值而不是截断 。 很难真正截断一个double
值,因为它实际上不在正确的基础上……但截断decimal
值更为可行。
您应该使用适当的格式字符串,例如自定义或标准字符串
string x = d.ToString("0.00");
要么
string x = d.ToString("F2");
值得注意的是,double值本身并不“知道”它有多少小数位。 只有当你将它转换为字符串时才真正有意义。 使用Math.Round
将获得与Math.Round
最接近的double值(如果你看到我的意思)但由于二进制浮点类型的工作方式,它几乎肯定不会是精确的值x.xx00000
。
如果您需要除字符串格式之外的任何其他内容 ,则应考虑使用decimal
代替。 价值实际代表什么?
我在.NET中有关于二进制浮点和十进制浮点的文章,您可能会发现它们很有用。
你尝试过什么? 它对我有效:
double original = 12.123456789; double truncated = Math.Truncate(original * 100) / 100; Console.WriteLine(truncated); // displays 12.12
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); }
这个代码….
double x = 12.123456789; Console.WriteLine(x); x = Math.Round(x, 2); Console.WriteLine(x);
返回此….
12.123456789 12.12
你想要的结果有什么不同?
如果你想把这个值保持为一个双精度值,并且只是在第二个小数位后面的任何数字上剥离并且实际上没有对数字进行舍入,那么你可以简单地从你的数字中减去0.005,这样那个回合就可以了。 例如。
double x = 98.7654321; Console.WriteLine(x); double y = Math.Round(x - 0.005, 2); Console.WriteLine(y);
产生这个……
98.7654321 98.76
我确信那里有更多东西。但为什么不呢: –
double truncVal = Math.Truncate(val * 100) / 100; double remainder = val-truncVal;
怎么样:
double num = 12.12890; double truncatedNum = ((int)(num * 100))/100.00;
这可能有效(虽然未经测试):
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);
对象编号= 12.123345534;
的String.Format({ “0:00”},number.ToString());
如果您希望在小数点后有两个点而不对数字进行舍入,则以下内容应该有效
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));
substring的第二个参数是count,而IndexOf返回到从零开始的索引,因此我们必须在添加2个十进制值之前添加一个。
这个答案假定该值不应该四舍五入
对于vb.net,请使用此扩展名:
Imports System.Runtime.CompilerServices Module DoubleExtensions 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