Усечь число цифр двойного значения в С#

Как я могу усечь ведущую цифру двойного значения в С#, я пробовал Math.Round(doublevalue, 2), но не дал требуемого результата. и я не нашел другого метода в классе Math.

Например, у меня есть значение 12.123456789, и мне нужно только 12.12.

Ответ 1

EDIT: Было указано, что эти подходы вокруг значения вместо усечения. Трудно действительно урезать значение double, потому что оно действительно не находится в правильной базе... но более укорочение значения decimal является более выполнимым.

Вы должны использовать соответствующую строку формата, custom или standard, например

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

или

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

Стоит осознавать, что само двойное значение не "знает", сколько десятичных знаков оно имеет. Это происходит только тогда, когда вы конвертируете его в строку, которая имеет смысл сделать это. Используя Math.Round, вы получите ближайшее двойное значение до x.xx00000 (если вы понимаете, что я имею в виду), но почти наверняка это будет не точное значение x.xx00000 из-за того, как работают двоичные типы с плавающей запятой.

Если вам это нужно для чего-то другого, кроме форматирования строки, вам следует использовать вместо этого decimal. Что действительно представляет значение?

У меня есть статьи о двоичная с плавающей запятой и десятичная плавающая точка в .NET, который вам может пригодиться.

Ответ 2

Что ты пробовал? Он работает как ожидалось для меня:

double original = 12.123456789;

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

Console.WriteLine(truncated);    // displays 12.12

Ответ 3

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);
}

Ответ 4

Этот код....

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

Ответ 5

Я уверен, что там что-то еще .netty, но почему бы не просто: -

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

Ответ 6

Это может работать (хотя и не проверено):

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);

Ответ 7

номер объекта = 12.123345534;
String.Format({ "0:00" }, number.ToString());

Ответ 8

Если вы хотите иметь две точки после десятичной точки без округления числа, то следует работать

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 десятичных значения.

Этот ответ предполагает, что значение НЕ должно быть округлено

Ответ 9

Как насчет:

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

Ответ 10

Для 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