Это фундаментальное ограничение для типов с плавающей запятой . На самом деле double
хранится внутри как показатель степени знака и мантисса, показатель степени - база 2, поэтому у него много проблем с базой 10..
Самым простым решением является использование 64-битного базового типа с плавающей запятой, а именно decimal
.Он по-прежнему с плавающей точкой, он все еще имеет ограниченную точность, но во многих случаях он более дружественный и более точный для работы
Обновление
Если все, что вы хотитеЧтобы изменить вывод на экран, вы можете использовать округление (которое вам известно) или соответствующие спецификаторы формата с string.format
ToString
или интерполяцию строки
Пример
var number = 5.123455123321321;
Console.WriteLine(number.ToString("F3",
CultureInfo.InvariantCulture));
Console.WriteLine($"{number:F3}");
// Displays 5.123
// Displays 5.123