Para ampliar las explicaciones de Escafandra y Agustín déjenme decir que el tipo Double solo puede tener 15 dígitos significantes (16 para un caso especial). De ahí en adelante es basura.
Si se ponen a contar los dígitos de 16.51000000000000160000000000 desde el 1ro de la izquierda hacia la derecha, llegarán a que justo esos 160000000000 están en el 16vo dígito.
No se aconseja usar extended a menos que sea estrictamente necesario. Esto es debido a que su implementación depende de la arquitectura.
Hace un buen tiempo he dejado un hilo con mucho material sobre aritmética de punto flotante. Recomiendo por sobre todo la lectura del documento "Lo que todo informático debe saber sobre aritmética flotante". El título lo dice todo, es un tanto denso (y está en inglés) pero vale la pena su lectura.
Lo qu si me permito corregir a Agustín es su 1er párrafo:
Esos problemas de aproximacion ocurren porque no estas usando el tipo de dato adecuado. Si necesitas precision en los digitos decimales, deberias usar currency, como se comento.
El problema no es que esté usando el tipo adecuado, o que un tipo no sea correcto ni preciso.
El tipo Double es bastante útil, para casi todas las operaciones de la vida real que imaginemos. Si, hasta para ciertas operaciones de ingeniería nos es suficiente.
El problema no son los tipos... ni la cantidad de decimales, ni la aritmética flotante.
El problema está en que le damos un uso incorrecto para lo cual fueron pensados.
Y esto es más que nada por el desconocimiento del funcionamiento y de como es que fueron implementados. Si tenemos presente el formato de cada tipo de dato de aritmética flotante y definimos los criterios tolerable de pérdida de precisión aceptables entonces el miedo a usarlos desaparece. Los cálculos SI se hacen de manera precisa y exacta a los dígitos significativos que fueron definidos. Pretender ir más allá para lo cual fueron pensados y diseñados es nuestro error.
Estadísticamente, para el caso del tipo double podemos trabajar sin temor alguno hasta el orden de e-12. Dejando los dos últimos dígitos de guarda como error tolerables para nuestras operaciones. Es más este valor (e-12) es el valor por defecto de la variable epsilon para la determinación del error absoluto para el tipo double. Internamente los cálculos se realizan de manera precisa para los "dígitos faltantes", pero es habitual y más que recomendable dejar esta guarda ya que cuanto operemos con otros cálculos posterioes son estos últimos los que se verán afectados por algún desplazamiento de la coma.
Saludos,