Преобразование c# float в decimal

любой умный способ конвертировать поплавок, как это:

float f = 711989.98f;

в десятичный (или двойной) без потери точности?

Я пробовал:

decimal d = (decimal)f;
decimal d1 = (decimal)(Math.Round(f,2));
decimal d2 = Convert.ToDecimal(f);

4 ответов


слишком поздно, 8-я цифра была потеряна в компиляторе. Тип float может хранить только 7 значащих цифр. Вам придется переписать код, присвоение double или decimal, конечно, решит проблему.


это может быть ошибка компилятора, потому что кажется, что допустимый float должен преобразовываться непосредственно в десятичный. но не потеряет решимости. Преобразование 125.609375 из float в decimal потеряет разрешение. Однако преобразование его из float в double, а затем double в decimal сохранит разрешение.

    float float_val = 125.609375f;

    decimal bad_decimal_val = (decimal)float_val;   //125.6094

    double double_val = (double)float_val;
    decimal good_decimal_val = (decimal)double_val;

вы пробовали?

decimal.TryParse()

http://forums.asp.net/t/1161880.aspx

нет неявных преобразований между float / double и decimal. Неявные числовые преобразования всегда гарантированно будут без потери точности или величины и не вызовут исключения.


вы потеряли точность в тот момент, когда вы написали 711989.98 f.

711989.98 является десятичным. С f в конце вы просите компилятор преобразовать его в float. Это преобразование не может быть выполнено без потери точности.

то, что вы, вероятно, хотите, это decimal d = 711989.98 m. Это не потеряет точности.