это норма. Тут объяснили, почему так. Только никто не удосужился посоветовать самое простое решение:
Используйте форматированный вывод, например так:
printf("%.4lf",d); //%.Klf - K - число символов после точки, в данном случае 4
для cout
тоже есть форматированный вывод, если принтф не устраивает