Округлення числа до необхідної точності (заданої кількості значущих цифр), стрілець coder

Як округлення числа до заданої точності пов'язано з поняттям значущих цифр. Чим округлення до потрібної кількості значущих цифр відрізняється від звичайного округлення до потрібної кількості знаків після коми?

Справа в тому, що знаки після коми і значущі цифри це різні поняття.

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

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

Постановка даного завдання досить проста.

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

Перше з чого слід почати це визначити порядок числа і загальна кількість десяткових розрядів.

Якщо кількість десяткових розрядів збігається з необхідною кількістю значущих цифр, то на цьому робота алгоритму завершена. Можна повертати результат (рівний вихідному числу). Але, подібні випадки - виняток.

В інших випадках потрібно виконати округлення. На щастя, це завдання можна легко звести до звичайного округлення до заданої кількості знаків після коми. Для цього необхідно:

  1. Розділити округляти число на 10 в ступені рівній його порядку;
  2. Округлити отриманий результат до кількості знаків після коми рівному необхідному кількості значущих цифр мінус 1;
  3. Помножити результат округлення на 10 у степені рівній порядку вихідного числа.

Для наочності нижче наведені приклади реалізації округлення до заданої кількості значущих цифр на мовах програмування Delphi, C # і Java.

Приклад на Delphi:

[Code lang = "delphi»] function GetSignificationDigit (digs: integer; d: double): double;
var
r, dp, dd: double;
magnitudeOfNumber, numberOfDigits: integer;
begin
// Порядок числа
magnitudeOfNumber: = Floor (Log10 (d));
// Загальна кількість десяткових розрядів
numberOfDigits: = Ceil (Log10 (d));
if (numberOfDigits = digs) then
// Якщо кількість розрядів дорівнює кількості значущих цифр
r: = d
else
begin
// Якщо ні
dp: = Power (10, magnitudeOfNumber);
dd: = Power (10, digs - 1);
r: = d / dp;
r: = (Round (r * dd) / dd) * dp;
end;

result: = r;
end; [/ code]

[Code lang = "c-sharp»] private double getSignificationDigit (int digs, double d)
double r;
// Порядок числа
int magnitudeOfNumber = (int) Math.Floor (Math.Log10 (d));
// Загальна кількість десяткових розрядів
int numberOfDigits = (int) Math.Ceiling (Math.Log10 (d));
if (numberOfDigits == digs)
// Якщо кількість розрядів дорівнює кількості значущих цифр
r = d;
>
else
//Якщо ні
double dp = Math.Pow (10, magnitudeOfNumber);
double dd = Math.Pow (10, digs - 1);
r = d / dp;
r = (Math.Round (r * dd) / dd) * dp;
>
return r;
> [/ Code]

[Code lang = "java"] private double getSignificationDigit (int digs, double d) double r;
// Порядок числа
int magnitudeOfNumber = (int) Math.floor (Math.log10 (d));
// Загальна кількість десяткових розрядів
int numberOfDigits = (int) Math.ceil (Math.log10 (d));
if (numberOfDigits == digs)
// Якщо кількість розрядів дорівнює кількості значущих цифр
r = d;
>
else
//Якщо ні
double dp = Math.pow (10, magnitudeOfNumber);
double dd = Math.pow (10, digs-1);
r = d / dp;
>
return r;
> [/ Code]

Для округлення до потрібної кількості значущих цифр використовується речовинний тип даних. Внаслідок цього, як і вона була точність округлення, результат завжди буде містити деяку погрішність. При цьому, чим менше порядок вихідного числа, тим ця похибка помітніше.

Наскільки це критично, залежить від специфіки виконуваних розрахунків або вимірювань. В інженерних розрахунках це, як правило, цілком допустимо. Тим більше, що їх точність рідко перевищує 3-4 значущих цифри. У той же час для фінансових розрахунків, де потрібно порівнювати грошові суми, подібні витрати неприпустимі. Також, наявність похибки може позначитися на точності наукових розрахунків і розрахунків з високими вимогами до точності.

У багатьох мовах програмування є спеціальний тип даних decimal або йому подібні, що частково знімає цю проблему. Але, в загальному випадку, вплив похибки обумовленої специфікою речових типів даних необхідно, так чи інакше, враховувати.

Навігація по публікаціям