Избегайте ошибки округления при ручном синтаксическом анализе double

Я хотел реализовать простой парсер для двойных значений (просто для удовольствия). Однако я заметил, что при обработке десятичного сдвига я получаю ошибки округления при умножении значения на 10.

Мне интересно, как double.Parse гарантирует, что значение результата будет как можно ближе к строковому значению?

Просто пример: при разборе 0,0124 (= 124 * 0,0001) я получаю 0,012400000000000001. Однако double.Parse, как и ожидалось, отображает 0,0124.


person LionAM    schedule 10.07.2015    source источник
comment
Я надеюсь, вы понимаете, что в обоих случаях оно не равно 0,0124, но это хороший вопрос, чтобы понять A. каково реальное значение, анализируемое double.Parse и B. как это работает   -  person Amit    schedule 10.07.2015
comment
Конечно. Значение типа double хранится в двоичном формате. Таким образом, для многих десятичных чисел нет точного представления.   -  person LionAM    schedule 10.07.2015


Ответы (1)


Решение кажется довольно простым: просто не умножайте на значения меньше 1 (например, 0,0001 в приведенном выше примере), а делите на 1 / x (10000 в приведенном выше примере).

Я думаю, причина в том, что целочисленные значения имеют точное представление (до 2 ^ 53), поэтому в частном нет ошибки округления (как было в множителе ‹1).

person LionAM    schedule 10.07.2015