Удивительно, что у этой функции есть блок комментариев, который фактически не объясняет, что это за «шум», с которым она пытается справиться, и как он влияет на значение.
То, как я это читаю, если число имеет менее 27 цифр от 10 до 10 (или равно нулю), оно преобразуется в десятичную, а затем обратно в двойную. Я ожидал бы, что преобразование в десятичное значение должно не повлиять на значение, поскольку десятичное разрешение имеет большее разрешение, чем двойное. Преобразование обратно в двойное число снова должно быть без потерь.
Пример Питера показывает, что эта операция действительно влияет на значение, поэтому, по-видимому, преобразования из двойного в десятичное и обратно не сохраняют значения, даже если они могут быть. Глядя в msdn, я вижу это:
http://msdn.microsoft.com/en-us/library/yht2cx7b(v=VS.80).aspx
что говорит:
Когда вы конвертируете float или double в
десятичное, исходное значение преобразуется
в десятичном представлении и округлые
на ближайший номер после 28 числа
десятичное место, если требуется.
Ладно, значит, округляется. Это означает, что если у вас есть double со значением 1.9999999999999999999999999999, преобразование в десятичное число округлит его до 2, поэтому, когда оно конвертируется обратно в double, вы получаете double со значением точно 2.0.
Если число имеет более 27 цифр , оно преобразуется в строку, а затем анализируется. Я не уверен, каков будет конечный результат - это будет зависеть от поведения по умолчанию ToString и Double.parse.