1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
---
title: Math.fround()
slug: Web/JavaScript/Reference/Global_Objects/Math/fround
tags:
- JavaScript
- Math
- fround
- Довідка
- метод
translation_of: Web/JavaScript/Reference/Global_Objects/Math/fround
---
<div>{{JSRef}}</div>
<p class="seoSummary">Функція <strong><code>Math.fround()</code></strong> повертає найближче зображення числового аргументу у вигляді 32-бітного числа з рухомою комою {{interwiki("wikipedia", "Число_одинарної_точності","одинарної точності" )}}.</p>
<div>{{EmbedInteractiveExample("pages/js/math-fround.html")}}</div>
<p class="hidden">Джерело цих інтерактивних прикладів зберігається у репозиторії на GitHub. Якщо ви маєте бажання зробити свій внесок у проект інтерактивних прикладів - будь ласка, зклонуйте репозиторій <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> та пришліть нам pull request.</p>
<h2 id="Синтаксис">Синтаксис</h2>
<pre class="syntaxbox">var <em>singleFloat</em> = Math.fround(<em>doubleFloat</em>);</pre>
<h3 id="Аргументи">Аргументи</h3>
<dl>
<dt><code>doubleFloat</code></dt>
<dd>{{jsxref("Number")}}. Якщо аргумент має інший тип - його буде приведено до числа, або ж до {{jsxref("NaN")}} у випадку, якщо таке приведення неможливе.</dd>
</dl>
<h3 id="Результат">Результат</h3>
<p>Зображеня аргументу у вигляді найближчого 32-бітного числа з рухомою комою <span class="seoSummary">{{interwiki("wikipedia", "Число_одинарної_точності","одинарної точності" )}}</span>.</p>
<h2 id="Опис">Опис</h2>
<p>JavaScript всередині використовує 64-бітні числа із рухомою комою подвійної точності. Це забезпечує дуже високу точність обчислень. Однак, інколи у вас може виникнути потреба працювати із 32-бітними числами того ж типу. Зокрема, якщо ви читаєте дані із {{jsxref("Float32Array")}}. Це може викликати певну плутанину: перевірка рівності 64-бітного та 32-бітного чисел може дати негативний результат, навіть якщо числа здаються однаковими.</p>
<p>Щоб вирішити цю проблему, можна застосувати <code>Math.fround()</code> для перетворення 64-бітного числа у 32-бітне. JavaScript всередині продовжить вважати числа за 64-бітні, натомість виконуючи "округлення до найближчого парного" на 23-му біті мантиси, і встановлююючи наступний за нею біт в <code>0</code>. Якщо число виходить за межі 32-бітного із рухомою комою, то в результаті буде отримана <code>{{jsxref("Infinity")}}</code> чи <code>-Infinity</code>.</p>
<p>Оскільки <code>fround()</code>є статичним методом <code>Math</code>, він завжди використовується як <code>Math.fround()</code>, а не метод створеного Вами об'єкту <code>Math</code> (<code>Math</code> не є конструктором).</p>
<h2 id="Приклади">Приклади</h2>
<h3 id="Застосування_Math.fround()">Застосування <code>Math.fround()</code></h3>
<p>Число 1.5 може бути точно відтворено у двійковій системі числення, причому 32-бітний і 64-бітний результати будуть однакові:</p>
<pre class="brush: js">Math.fround(1.5); // 1.5
Math.fround(1.5) === 1.5; // true
</pre>
<p>Однак, число 1.337 не може бути точно зображено у двійковій системі числення, тож 32-бітне і 64-бітне зображення цього числа будуть відрізнятись:</p>
<pre class="brush: js">Math.fround(1.337); // 1.3370000123977661
Math.fround(1.337) === 1.337; // false
</pre>
<p><math><semantics><msup><mn>2</mn><mn>150</mn></msup><annotation encoding="TeX">2^150</annotation></semantics></math> - занадто велике для 32-бітного числа із рухомою комою, тому результатом буде <code>Infinity</code>:</p>
<pre class="brush: js">2 ** 150; // 1.42724769270596e+45
Math.fround(2 ** 150); // Infinity
</pre>
<p>Якщо аргумент не може бути приведеним до числа, чи просто являється <a href="https://en.wikipedia.org/wiki/NaN" title="NaN on Wikipedia">not-a-number</a> (<code>NaN</code>), <code>Math.fround()</code> поверне <code>NaN</code>:</p>
<pre class="brush: js">Math.fround('abc'); // NaN
Math.fround(NaN); // NaN
</pre>
<h2 id="Поліфіл">Поліфіл</h2>
<p>Даний функціонал можна відтворити за допомогою наступної функції (за умови наявної підтримки {{jsxref("Float32Array")}}):</p>
<pre class="brush: js">Math.fround = Math.fround || (function (array) {
return function(x) {
return array[0] = x, array[0];
};
})(new Float32Array(1));
</pre>
<h2 id="Специфікації">Специфікації</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Специфікація</th>
<th scope="col">Статус документу</th>
<th scope="col">Примітка</th>
</tr>
<tr>
<td>{{SpecName('ES6', '#sec-math.fround', 'Math.fround')}}</td>
<td>{{Spec2('ES6')}}</td>
<td>Первинне визначення.</td>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-math.fround', 'Math.fround')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td> </td>
</tr>
</tbody>
</table>
<h2 id="Підтримка_у_браузерах">Підтримка у браузерах</h2>
<p class="hidden">Таблиця сумісності на цій сторінці сформована автоматично із структурованих даних. Якщо ви маєте бажання зробити свій внесок до цих даних - будь-ласка, ось репозиторій <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a>, надішліть нам свій pull request.</p>
<p>{{Compat("javascript.builtins.Math.fround")}}</p>
<h2 id="Дивіться_також">Дивіться також</h2>
<ul>
<li>{{jsxref("Math.round()")}}</li>
</ul>
|