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

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

  • автор:

Ограничить поплавок двумя знаками после десятичной точки в C++

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

1. Использование round() функция

Существует несколько вариантов ограничения числа с плавающей запятой двумя знаками после запятой, в зависимости от того, хотите ли вы округлить число до ближайшего, округлить в меньшую или большую сторону. Например, следующий код округляет число с плавающей запятой до двух знаков после запятой.

Задание количества знаков после запятой

Есть переменная типа double d=0,12312332453. Подскажите, пожалуйста — как задать вывод в консоли заданного количества знаков после запятой?

freim's user avatar

Например, с помощью форматирования строки через String.Format(string, object). Console.WriteLine(string, object) то же самое, только сразу в консоль показывает.

Следующий код показывает число и 2 знака после запятой:

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43300

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

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

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

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

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

Если «усечение» предназначено только для отображения, это может быть достигнуто путем преобразования значения в строковое представление. Это сохранит точность и позволит избежать некоторых ошибок, связанных с попыткой точного манипулирования десятичными числами числа с плавающей запятой. — Л.Бушкин

@LBushkin: Верно. Это зависит от того, что требуется. Иногда компании действительно хотят, чтобы вычисления выполнялись с усеченными значениями в каждой точке . а иногда только для отображения. Хорошо отметить. — Джон Скит

@JonSkeet по умолчанию обрезается до 3 знаков после запятой? — Эхсан Саджад

@ EʜsᴀɴSᴀᴊᴊᴀᴅ: Нет, я не уверен, почему вы так думаете. — Джон Скит

@ EʜsᴀɴSᴀᴊᴊᴀᴅ: это умножение на 1000, усечение до целого числа и деление на 1000. Если бы вместо этого было 10000 м, это было бы до 4 знаков после запятой. — Джон Скит

Я не могу придумать причину явной потери точности за пределами отображения. В этом случае просто используйте форматирование строки.

Мне это нужно, потому что я сопоставляю значения из файла XML с теми, которые хранятся в БД. Оба источника заполняются разными сторонами. Тот, который заполняет Db, предпочитает не заполнять ничего, превышающего 3 десятичных знака, в то время как XML-файл часто может иметь до 8 десятичных знаков — хбонез

@StevenSudit И еще один возможный вариант использования, такой как мой, — это когда у меня есть поле DB, которое может принимать только 10 символов, но в форме есть поле lb -> kg, где выполняется вычисление и может давать число> 10 символов. Иногда вам просто нужно несколько значащих цифр и не нужно усекать или округлять, но есть ограничения на количество цифр, которые вы можете сохранить. Поэтому я бы отрицательно поставил под сомнение этот вариант использования, поскольку он очень распространен при хранении чисел в поле БД, а не при голосовании за него. К счастью, у него есть полезный ответ, поэтому я буду голосовать за него. — vapcguy

Округление десятичных значений в C#


Тип данных decimal используется для хранения чисел с высоким уровнем точности. Потенциально большое количество знаков после запятой полезно для многих математических или статистических расчетов. Тем не менее, иногда необходимо и округлять эти значения. Эта проблема не так часто волнует разработчиков, пишущих программы на заказ, но для студентов или самостоятельно изучающих язык C# статья ниже может оказаться весьма полезной.

Округление значения

C# предоставляет три собственные числовые типы данных для хранения значений с плавающей запятой. К ним относятся одинарной точности, двойной точности и десятичные числа, которые объявляются с помощью «float», «double» и «decimal» ключевых слов соответственно. Каждый из этих типов имеет различный диапазон возможных значений с различной степенью точности. Тип » float » является наименее точным с наименьшим диапазоном значений. Тип «decimal» имеет самый большой диапазон и наибольшую точность. Выбор типа значения для использования в любых целях является компромиссом между требованиями размера и точности чисел и объемом памяти, используемой объявленной переменной.

В этой статье мы будем работать с типом данных decimal, но акцентируем внимание не на его размере и точности, а на дополнительной функциональности, присущей этому типу в отличие от двух других вариантов. В частности, мы будем использовать четыре статических метода округления, которые доступны только для десятичных значений. Конечно, это можно использовать и для одно- и двойной чисел точности тоже. Однако в этих случаях необходимо сначала привести к или преобразовать значение в decimal или использовать члены класса Math.

Обратите внимание: Методы, описанные в этой статье, требуют .NET Framework версии 2.0 или более поздней версии. Некоторые из функций доступны в .NET 1.1, но там использование может быть ограничено.

Одним из основных способов округления decimal является Truncate (усечение). При усечении, все дробные цифры просто удаляются из числа, оставляя только целую часть, хотя по-прежнему число удерживается в десятичной системе. Это можно легко продемонстрировать с помощью следующего кода. Обратите внимание, как дробная часть удаляется, а значения округляются вниз до ближайшего целого числа в первых двух строках. В третьей строке значение остается неизменным, так как нет дробной части. В двух последних строках отрицательные значения эффективно округляются в сторону увеличения.

Floor и Ceiling

Статические методы Floor и Ceiling выполняют аналогичные функции усечения: они удаляют дробную часть числа и возвращают целое число. Опять же целое число возвращается в десятичной структуре. Основное различие между этими методами и Truncate является то, что направление округления фиксируется как для положительных и отрицательных чисел. Для функции Floor округление всегда вниз, а Ceilin всегда вверх, как можно видеть в результатах примере кода ниже.

Контролируемые округления

Три описанных выше способа могут быть использованы во многих сценариях. Тем не менее, они ограничены работой с целыми значениями и они не работают по нормальным правилам математического округления. Там, где требуется дополнительные функциональные возможности, может быть использован метод Round. Этот метод дает больший контроль над округлением, позволяет гибко работать с числами.

В заключительной части этой статьи мы рассмотрим метод Round более подробно.

Простое округление

Самый простой способ, которым можно использовать метод Round, это с одним параметром, содержащим число, которое надо изменить. При использовании таким образом возвращаемое значение содержит целое число, которое ближе всего к переданному значению.

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

Можно было бы ожидать, что оба значения округляются в сторону увеличения и метод возвратит 2 и 3 соответственно. Однако, по умолчанию, этот метод использует правило средней точки (медианы), которое гласит, что когда значение округляется ровно на полпути между двумя целыми числами, всегда выбирается ближайшее значение.

Правила медианы

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

Чтобы задать правило, параметр MidpointRounding добавляется к вызову метода.

Округление до указанного количества десятичных знаков

Все примеры до сих пор рассматривали округление значения, когда в результате возвращается целое число. Однако метод Round позволяет также округление до определенного количества знаков после запятой. Это достигается путем определения необходимого количества знаков после запятой в качестве второго параметра метода, как показано в следующих примерах:

Здесь правило медианы по умолчанию «ToEven» применяется для округления, за исключением того, что конченая цифра округляется до ближайшего четного числа.

Вы можете изменить правило медианы, используется при округлении до количества знаков после запятой. Чтобы сделать это, просто добавьте значение MidpointRounding в качестве третьего параметра:

Примечание из msdn.microsoft.com к Math.Round

Таким образом, в статье мы попробовали немного прояснить ситуацию с округлением decimal. Как видим, все не так уж и сложно, но есть нюансы, которые необходимо иметь в виду при написании программ. Кстати, программы на заказ пишу и я. Недорого, быстро и с гарантией.


Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, си шарп, округление, decimal

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

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