Ограничение числа 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.
Отредактирует код нашей программы:
Заново скомпилируем и выполним его. Результат:
Именно этот результат мы и ожидали:
Отметим ещё раз — в самой программе используются все возможные знаки и разряды чисел, цифры обрезались в момент вывода.