mart19 Ответов: 2

C#: получить десятичную часть поплавка без округления


I would like to write function which give the decimal part of my float number. 
12.56 must return 56; 
90.2547 must return 2547; 
25 must return 0.


Что я уже пробовал:

float_number - Math.Truncate(float_number);

But this solution does not return the exact value. 90.2547 can return 254692547. I just want 2547 as result.

2 Ответов

Рейтинг:
6

BillWoodruff

См. это для понимания ограничений использования десятичных или плавающих типов для выражения числовых значений: [^].

private const int SIGN_MASK = ~Int32.MinValue;

public int GetDecimalRemainder(float fvalue)
{
    double dplaces;

    try
    {
        decimal dvalue = Convert.ToDecimal(fvalue);

        dplaces = (double) ((Decimal.GetBits(dvalue)[3] & SIGN_MASK) >> 16);

        return (int) ((dvalue - Math.Truncate(dvalue)) * (int) Math.Pow(10d, dplaces));
    }
    catch (Exception ex)
    {
        throw new TypeInitializationException(@"{fvalue} cannot be converted", ex);
    }
}
Записи:

0 обратите внимание, что преобразование в десятичную дробь может округлить значение, что приведет к потере точности og в мантиссе.

1 это будет возвращать отрицательное число, если входной поплавковый негативные

2 Использование ' GetBits для нахождения числа степеней десяти в поплавковой мантиссе iis на основе: [^]


Рейтинг:
19

Nacoumblé Olivier Martial Soro

Я думаю, что это сделает свою работу:

public int GetDecimalPart(float number)
        {
            var decimalNumber = Convert.ToDecimal(number);
            int decimalPart = int.Parse((decimalNumber % 1).ToString().Replace("0.", ""));

            return decimalPart;
        }


BillWoodruff

Обратите внимание, что преобразование в десятичную дробь будет округлять значение.

Nacoumblé Olivier Martial Soro

При использовании функции Convert.Decimal значение не округляется. Значение округляется с помощью новой десятичной дроби (числа).

BillWoodruff

Вы ошибаетесь.

decimal dec = конвертировать.ToDecimal(76790.25476 f) // => 76790.26