Преобразование OracleDecimal в System.Double в C # - PullRequest
2 голосов
/ 29 марта 2011

У меня возникли некоторые проблемы с преобразованием значения из OracleDecimal.Вот код

public static T GetReaderValue(this OracleDataReader dr, string col) where T : struct
{
    int colNo = dr.GetOrdinal(col);
    var value = (double)OracleDecimal.SetPrecision(dr.GetOracleDecimal(colNo), 28);
    return (T) Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture);
}

Это прекрасно работает для большинства значений, но для некоторых, таких как 0.12345, он возвращает числа вроде 0.123499999999.

Может кто-нибудь предложить какой-либо совет о том, как конвертировать OracleDecimal без этихошибки округления?

Спасибо!

1 Ответ

4 голосов
/ 29 марта 2011

System.Double хранится в базе 2, а не в базе 10. Для некоторых чисел, которые могут быть представлены с использованием конечного числа цифр в базе 10, требуется бесконечное количество цифр в базе 2 (и наоборот).

Поскольку в базе данных хранится десятичное число, лучше вместо этого преобразовать в значение System.Decimal, чтобы не потерять точность (так как System.Decimal использует базу 10 так же, как и OracleDecimal) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...