Преобразование числа с плавающей запятой в десятичное, неправильно теряющее точность - PullRequest
1 голос
/ 26 марта 2012

У меня есть следующий пример кода:

        float val = 16777216.0F;
        var badResult = Convert.ToDecimal(val);
        //badResult has value 16777220

Почему потеряна эта точность?значение равно 2 ^ 24, значение, которое может представлять число с плавающей точкой.Существуют ли какие-либо библиотеки .net, которые я могу использовать, чтобы заставить это преобразование работать правильно, без необходимости накатывать собственный iCustomFormatter?

Спасибо!

Редактировать, это уродливый код, который я использовал в качестве решения

var goodResult = Convert.ToDecimal(((double)val));

Ответы [ 2 ]

3 голосов
/ 26 марта 2012

Из документации для System.Single:

По умолчанию значение Single содержит только 7 десятичных цифр точности, хотя внутренне поддерживается максимум 9 цифр.

Указанное значение действительно соответствует 7 значащим цифрам.Хотя точное значение с плавающей точкой на самом деле является тем, которое вы дали, представляется разумным, чтобы преобразование в строку показывало только то количество цифр, которое, как известно, является правильным, при этом последняя цифра равнапотенциально округлые.

1 голос
/ 26 марта 2012

Преобразование в десятичное работает отлично; проблема в том, что тип float (System.Single) не может точно представлять это значение, поэтому на самом деле это 1.677722E+07. Если вы используете double (System.Double), который имеет более высокую точность, он будет работать как положено.

...