Как сделать точность до 2 знаков после запятой c

Обновлено: 02.07.2024

Не путайте "Вывод N знаков после запятой" и "Округление до N знаков после запятой".
Для округления по математическим правилам используется Round.
В данном случае, 15.21, 15.22, 15.23, 15.24 будут округлены до 15.2, если задать 1 цифру после запятой.
Числа же 15.25. до 15.29 будут округлены в бОльшую сторону. До 15.3
[code] double a = Math.Round(15.21, 1); //Результат 15,2 Console.WriteLine(a); a = Math.Round(15.24, 1); //Результат 15,2 Console.WriteLine(a); a = Math.Round(15.27, 1); //Результат 15,3 Console.WriteLine(a); Console.ReadKey(); [/code]
Второе число как раз отвечает за количество цифр после запятой:
[code] double a = Math.Round(15.21992734, 4); //Результат 15,2199 Console.WriteLine(a); Console.ReadKey(); [/code]
Для вывода округлённого числа, не меняя его значение, используется ToString:
[code] double a = 15.21992734; Console.WriteLine(a.ToString("0.0000")); Console.ReadKey(); [/code]
При этом - это не математическое округление, а просто вывод указанного количестве цифр после запятой.
[code] Console.WriteLine(a.ToString("0.0")); //Отобразить 1 цифру после запятой Console.WriteLine(a.ToString("0.00")); //Отобразить 2 цифры после запятой Console.WriteLine(a.ToString("0.000")); //Отобразить 3 цифры после запятой Console.WriteLine(a.ToString("0.0000")); //Отобразить 4 цифры после запятой [/code]
Для удаления дробной части числа используется функция Math.Floor
[code] double a = Math.Floor(15.21992734); //Результат 15 Console.WriteLine(a); Console.ReadKey(); [/code]
Для округления всегда в наибольшую сторону используется Math.Ceiling
[code] double a = Math.Ceiling(15.21992734); //Результат 16 Console.WriteLine(a); Console.ReadKey(); [/code]

Дополнительная информация о том, как вывести результат в консоли или WinForm

Как я могу умножить две дроби и округлить результат до 2 знаков после запятой?

Я попытался использовать математику.Этаж, но он просто округляется до 4.00. Вот пример:

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

два режима округления средней точки:

  1. AwayFromZero - когда число находится на полпути между двумя другими, оно округляется до ближайшего числа, которое находится от нуля. (Aka, round up)
  2. ToEven - когда номер находится на полпути между двумя другими, оно округляется к ближайшему четному числу. (Будет Благосклонен .16 более .17, а .18 более .17)

что вы хотите использовать Floor С некоторым умножения.

на output переменная должна иметь 4.17 в нем сейчас.

на самом деле вы также можете написать функцию, чтобы взять переменную длину:

однако вы можете имитировать функциональность, умножая число, пол, а затем делить на тот же множитель.

не идеальное решение, но должно работать, если их количество невелико.

еще одно решение-сделать округление к нулю от округления от нуля. Должно быть что-то вроде этого:

Есть ли способ внутри C ++ установить окончательное количество десятичных знаков для значения с плавающей запятой? например, если бы я записывал несколько раз как значения с плавающей запятой, я бы, скорее всего, генерировал разные результаты (с точки зрения количества десятичных разрядов) и хотел бы генерировать числа одинаковой длины, т. е. если бы число возвращалось как 1.33 и есть другие числа, возвращающиеся, как говорят 1.333 я хотел бы сделать первый результат читать как 1.330 ,

Я понимаю, что существуют методы ограничения количества десятичных знаков, такие как setprecision() но я не хочу терять точность моего времени.

Решение

Вы, кажется, путаете две вещи: фактическую точность вычислений с плавающей запятой в C ++ и форматирование float (или же double , или же long double ) значения при печати с потоками C ++ (например, cout).

Первое зависит от аппаратного обеспечения / платформы, и вы не можете управлять им, кроме выбора между float а также double , Если вам нужна лучшая точность, чем что long double может дать вам, вам нужна библиотека для математики произвольной точности, например GMPLIB .

Управление количеством цифр после точки при печати / форматировании проще, см., Например, этот вопрос: Установите цифры после десятичной точки

Другие решения

Если вам нужно ограничить цифры после десятичной точки, будь то фолат, двойная или длинная двойная, то стоит использовать (setprecision). Когда вы используете его отдельно, он будет включать в себя также цифры перед десятичной запятой, а также, если цифры после десятичной запятой меньше установленной точности, он не будет добавлять ноль после них. И решение заключается в использовании фиксированной и showpoint. Поэтому, если вы хотите установить точность до 3 цифр после десятичной точки, напишите эту строку перед отображением или вычислением значений.

Microsoft Logo

Gray Pipe

Приносим извинения. Запрошенное содержимое было удалено. Вы будете автоматически перенаправлены через 1 секунду.

Лучший отвечающий

Вопрос

Можно ли доверять точности встроенных типов Double, Float?

Что это означает?

Подходит ли этот тип для инженерных расчётов или банковских вычислений? Или нужны специальные математические библиотеки? (имеются ли ошибки самих операций +-*/, как быть с накоплением ошибок - можем ли получить гарантированные знаки?)

Показывается ли при отладке в Visual Studio реальное число правильных цифр результата?

Ответы

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

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

Можете попробовать эту статью:

Если трудности с языком то найдите курс для ВУЗ'ов (или как они сейчас называются) на русском.

Например ваше высказывание про 1 значащую цифру конечно же неверно. Если бы это было так то результат операции 1000+100 был бы равен 1000. (так как 1100 имеет два значащих разряда). Думаю теперь вам понятно что значит 15-16 значащих разрядов?

Применимость конкретного типа для конкретного случая зависит от многих факторов.

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

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

This posting is provided "AS IS" with no warranties, and confers no rights.

  • Предложено в качестве ответа Yatajga Moderator 6 января 2016 г. 13:03
  • Помечено в качестве ответа Maksim Marinov Microsoft contingent staff, Moderator 1 февраля 2016 г. 11:11


Т.е., y=x+1.7152230341146 также подсчитается ВСЕГДА правильно?

Тут 13 цифр после точки. А в первом 2.



Вам надо прочитать статью. Лучше несколько. Там как раз и описаны возможные проблемы. Плюс практика конечно. Через месяц-два начнете понимать что к чему. В голове сформируется "список" возможных ошибок и проблем.

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

Вы так же путайте число значащих разрядов с точностью операций. Это разные вещи. Например если ваши часы показывают 07:53:28 (с точностью до секунды), это вовсе не означает что время именно такое. Может на деле уже 08:02:22, часы просто отстали. Вы же не думайте что раз есть секунды, то именно столько их на самом деле? :)

Это относится к результатам выполнения функций вроде sin(х). Результат будет иметь 15 разрядов, но не обязательно все из них будут верными.

В вашем примере первое число имеет 3 значащих разряда, а во втором - 14. Точность ведь "не после запятой", а всего разрядов. Эти разряды могут быть и до запятой и с запятой по середине или очень даже после запятой. Например после запятой может быть сотня нулей, а потом уже 15 значащих разрядов.

В любом случае в данном примере числа одного порядка, так что скорее всего получится верное значение (в моем понимании - с возможными ошибками представления и округления).

Если х будет другое, например сильно больше или сильно меньше то результат может потерять точность. Скажем если х=3.14E100 то получится 3.14E100. Т.е. совершенно ничего не добавится.

В общем у меня больше для вас нет советов. Читайте, практикуйтесь. Хотя бы месяц. Удачи.

This posting is provided "AS IS" with no warranties, and confers no rights.

  • Помечено в качестве ответа Maksim Marinov Microsoft contingent staff, Moderator 1 февраля 2016 г. 11:12

Все ответы

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

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

Можете попробовать эту статью:

Если трудности с языком то найдите курс для ВУЗ'ов (или как они сейчас называются) на русском.

Например ваше высказывание про 1 значащую цифру конечно же неверно. Если бы это было так то результат операции 1000+100 был бы равен 1000. (так как 1100 имеет два значащих разряда). Думаю теперь вам понятно что значит 15-16 значащих разрядов?

Применимость конкретного типа для конкретного случая зависит от многих факторов.

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

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

This posting is provided "AS IS" with no warranties, and confers no rights.

  • Предложено в качестве ответа Yatajga Moderator 6 января 2016 г. 13:03
  • Помечено в качестве ответа Maksim Marinov Microsoft contingent staff, Moderator 1 февраля 2016 г. 11:11

Да, именно эту статью советуют многие. Я её уже начал читать.

Накопление ошибок, потеря значимости, переполнение. Должен ли этим заниматься сам программист или это уже реализовано в IDE (или в системе)? Там так много всего, что кажется невозможным учесть это в реальной программе. В Визуал Студио уже есть что-то, решающее эти проблемы (хотя бы подсказки)?

В документации PHP есть такой пример: floor((0.1+0.7)*10). И это оказывается равным не 8, а 7.

1100 - первые 2 цифры не 0, это правда. Но с таким же успехом можно было сказать, что важны все 4 разряда.

Вот в Википедии про потерю точности. Якобы цифры становятся не надёжными.

Тип Double всё-таки будет гарантировать точное число верных знаков (до запятой и/или после), или надо заниматься этим самому?

Было бы неплохо иметь подсказку в Visual Studio насчёт этого.

В теории чисел при работе с длинными числами я использовал BigInteger. Там важна каждая цифра.

Это задача программиста так как проблемы проявляются в процессе работы алгоритма. Инструменты не могут знать чего программист хочет.

Значение 7 вполне возможно. Это ошибка программиста который не знает особенностей работы плавающей точки. Да, конечно, тот же результат будет и в других языках (тут возможны варианты например если используется другой метод округления или другие инструкции процессора, но для каких то значений все равно возможно подобное). Код надо скорректировать для получения ожидаемого результата. Вам задача: как это сделать?

Эти рассуждения про 4 цифры происходят от непонимания как именно устроена плавающая точка. Дело в том что этих нулей в мантиссе нет, они "спрятаны" в порядке. Мантисса с 1 значащим разрядом всегда будет иметь только один разряд (n*10^p где n целое). T.e. можно представить 0.1 (n=1, p=-1), 1, 10, 1000, но не 1.1, не 11, 110 или 1100. Конечно на деле все еще сложнее так как все это записано в двоичном виде. Для десятичного разряда нужно не менее 4 двоичных, а это больше одного десятичного но меньше двух. Поэтому фактически точность будет 1-2 разряда.

Тип с плавающей точкой обеспечивает хранение определенного числа значащих разрядов. Что произойдет в процессе вычислений - это на программисте. Определенные инструменты (например Решарпер) дают подсказки по поводу наиболее очевидных ляпов с FP (например сравнение на равенство), но почти все остальное инструментам не под силу.

Теория и практика часто различаются. До распространения компьютеров (и калькуляторов) инженерные вычисления обычно делали с точностью 3-4 знака. Для 8 битных процессоров были библиотеки плавающей точки с 24 и даже 16 битными числами для повышения скорости работы и экономии памяти.

This posting is provided "AS IS" with no warranties, and confers no rights.

Читайте также: