Как я могу усечь ведущую цифру двойного значения в С#, я пробовал Math.Round(doublevalue, 2), но не дал требуемого результата. и я не нашел другого метода в классе Math.
Например, у меня есть значение 12.123456789, и мне нужно только 12.12.
Как я могу усечь ведущую цифру двойного значения в С#, я пробовал Math.Round(doublevalue, 2), но не дал требуемого результата. и я не нашел другого метода в классе Math.
Например, у меня есть значение 12.123456789, и мне нужно только 12.12.
EDIT: Было указано, что эти подходы вокруг значения вместо усечения. Трудно действительно урезать значение double
, потому что оно действительно не находится в правильной базе... но более укорочение значения decimal
является более выполнимым.
Вы должны использовать соответствующую строку формата, custom или standard, например
string x = d.ToString("0.00");
или
string x = d.ToString("F2");
Стоит осознавать, что само двойное значение не "знает", сколько десятичных знаков оно имеет. Это происходит только тогда, когда вы конвертируете его в строку, которая имеет смысл сделать это. Используя Math.Round
, вы получите ближайшее двойное значение до x.xx00000
(если вы понимаете, что я имею в виду), но почти наверняка это будет не точное значение 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
Я уверен, что там что-то еще .netty, но почему бы не просто: -
double truncVal = Math.Truncate(val * 100) / 100;
double remainder = val-truncVal;
Это может работать (хотя и не проверено):
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));
Второй параметр подстроки - это счетчик, а IndexOf возвращается к индексу на основе нуля, поэтому мы должны добавить его к этому, прежде чем мы добавим 2 десятичных значения.
Этот ответ предполагает, что значение НЕ должно быть округлено
Как насчет:
double num = 12.12890;
double truncatedNum = ((int)(num * 100))/100.00;
Для 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