Как ограничить количество знаков после запятой в c double
Перейти к содержимому

Как ограничить количество знаков после запятой в c double

  • автор:

Ограничение числа double до 3 знаков после запятой

В двойных числах нет десятичных знаков — они не основаны на десятичных цифрах. Вы можете получить «ближайшее двойное значение к текущему значению при усечении до трех десятичных цифр», но это все равно не будет точно таким же. Вам лучше использовать decimal .

При этом, если проблема возникает только из-за округления, вы можете использовать Math.Truncate(value * 1000) / 1000; , который может делать то, что вы хотите. (Судя по звуку, вы вообще не хотите округления .) Это все еще потенциально «хитроумно», поскольку в результате все равно будет не просто три десятичных разряда. Однако, если бы вы сделали то же самое с десятичным значением, оно было бы сработало:

РЕДАКТИРОВАТЬ: Как указал Л.Бушкин, вы должны четко понимать между усечением для целей отображения (что обычно можно сделать в спецификаторе формата) и усечением для дальнейших вычислений (в этом случае вышеуказанное должно работать).

Округлить число с плавающей запятой до 2 знаков после запятой в C#

В этом посте будет обсуждаться, как округлить число с плавающей запятой до 2 знаков после запятой в C#.

1. Использование ToString() метод

Мы можем использовать ToString() метод для форматирования значения с плавающей запятой до нескольких знаков после запятой. ToString() Метод принимает строку числового формата и преобразует текущее значение экземпляра в эквивалентную строку. Чтобы ограничить число с плавающей запятой до 2 знаков после запятой, вы можете использовать #.## спецификатор формата, как показано ниже:

Ограничение от 2 до 3 знаков после запятой

У парных разрядов нет десятичных знаков — они не основаны на десятичных разрядах для начала. Вы можете получить «ближайший двойной к текущему значению при усечении до трех десятичных цифр», но он все равно не будет точно таким же. Вам будет лучше использовать decimal .

Сказав это, если это только то, как происходит округление, что проблема, вы можете использовать Math.Truncate(value * 1000) / 1000; , который может делать то, что вы хотите. (Вы не хотите округлять вообще, звуками этого.) Это все еще потенциально «изворотливое», хотя в результате все еще на самом деле не будет просто иметь три десятичных знака. Если бы вы сделали то же самое с десятичным значением, это сработало бы:

РЕДАКТИРОВАТЬ: Как отметил Л. Бушкин, вы должны быть ясны между усечением для целей отображения (что обычно может быть сделано в спецификаторе формата) и усечением для дальнейших вычислений (в этом случае выше должно работать).

Почему в C++ для double в числе только 5 цифр после запятой

В языке C++ при определении переменных необходимо указать их тип, причём в дальнейшем тип менять нельзя.

Для числовых переменных распространёнными типами являются int, short, long, float и double.

К примеру, переменная с типом данных float — это число с плавающей точкой, для хранения которого используется 4 байта, а это 6-9 значимых цифр, обычно 7.

А переменная с типом данных double — это число с плавающей точкой, для хранения которого используется 8 байт, а это примерно 15-18 значимых цифр, обычно 16.

Зная это, рассмотрим следующий простейший код — для его выполнения, сохраните код в файл test.cpp:

Теперь скомпилируйте его:

Результат выполнения очень необычен:

Число 230.4732 обрезано до 230.473 — потерян одна цифра после запятой. А в числе типа double, значение которого 30949.12345678, обрезалось до 30949.1 — то есть вместо предполагаемых 15-18 значимых цифр получено только 6…

Отсюда возникает вопрос, почему в числе типа double можно использовать только 6 значимых цифр?

На самом деле, число double d содержит все цифры после запятой, которые присвоены этой переменной — всё дело в том, как выполняется проверка числа. У метода cout имеются свои настройки по умолчанию для вывода и форматирования чисел — если в числе больше 6 разрядов, то обрезаются цифры после запятой, если до запятой также больше 6 цифр, то используется научная запись числа, например 1.23457e+14.

Такое поведение по умолчанию cout можно исправить. Для этого, во-первых, необходимо добавить новый заголовок #include <iomanip>.

Во-вторых нужно использовать std::setprecision(n), где n — это новая величина точности.

При использовании в выражении out << setprecision(n) или in >> setprecision(n) устанавливает для параметра точности потока out или in значение ровное n.

Отредактирует код нашей программы:

Заново скомпилируем и выполним его. Результат:

Именно этот результат мы и ожидали:

Отметим ещё раз — в самой программе используются все возможные знаки и разряды чисел, цифры обрезались в момент вывода.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *