首頁 >web前端 >js教程 >JavaScript中舍入數字的指南

JavaScript中舍入數字的指南

Joseph Gordon-Levitt
Joseph Gordon-Levitt原創
2025-02-09 11:32:10577瀏覽

A Guide to Rounding Numbers in JavaScript

本文探討JavaScript中各種數字舍入方法,包括使用JavaScript數學函數和其他舍入到小數位的方法。我們還將介紹舍入數字時需要注意的問題。

關鍵要點

  • JavaScript提供了幾種舍入數字的方法,包括Math.roundMath.floorMath.ceilMath.truncMath.round舍入到最接近的整數,Math.floor向下舍入,Math.ceil向上舍入,Math.trunc截斷數字的小數部分。
  • 對於將數字舍入到特定的小數位數或有效數字,JavaScript提供Number.toFixedNumber.toPrecision方法。這些方法將舍入後的數字作為字符串返回。
  • 在處理負數時,Math.roundMath.floorMath.ceilMath.trunc的行為有所不同。例如,Math.floor將負數向下舍入到下一個最小的整數,而Math.trunc截斷小數部分,有效地將其向上舍入。
  • 由於數字的二進製表示,JavaScript中可能會出現精度問題。某些十進制數無法在二進制中精確表示,從而導致舍入誤差。 Math.fround方法可用於查找32位中最接近的可表示數字。
  • 舍入方法的選擇取決於具體的用例。 Math.round是捨入到最接近整數的良好通用選擇,但Math.floorMath.ceilMath.trunc可能更適合始終向下或向上舍入,或處理負數。 Number.toFixedNumber.toPrecision應用於舍入到特定的小數位數或有效數字。

JavaScript舍入

在處理數值時,我們有時會執行計算,這些計算最終會產生需要捨入到整數的小數部分——例如,當您計算平均價格或處理隨機數時。幸運的是,JavaScript的Math對象提供了許多將數字舍入到整數值的方法。

在我們的示例中,我們將使用兩個最重要的數學常數來演示不同類型的捨入:π(圓的周長與其直徑之比)和e(自然對數的底數,也稱為“歐拉數”)。這兩個值都是Math對象的屬性,但讓我們將它們賦值給一些變量,以便更容易處理:

<code class="language-javascript">const PI = Math.PI;
const E = Math.E;</code>

專業提示:您還可以使用對象解構在一行中進行此賦值:

<code class="language-javascript">const { PI, E } = Math;</code>

現在我們已經定義了這些常數,讓我們來看一下JavaScript中一些舍入數字的方法。

使用Math.round在JavaScript中舍入數字

我們將要查看的第一個方法是Math.round。這是最直接的選擇,它只是將任何帶有小數部分的數字舍入到最接近的整數。它使用以下規則:如果一個數字正好位於兩個整數之間,則將其向上舍入。例如,2.5將向上舍入到3。

要使用此方法,我們只需提供要捨入的數字作為參數:

<code class="language-javascript">const PI = Math.PI;
const E = Math.E;</code>

如果您想將數字舍入到最接近的整數值,Math.round()非常方便。例如,如果您要計算三次測試的平均分數,則將三個分數相加並除以三。這可能不會得到一個整數,因此您可以使用Math.round()將其舍入到最接近的值:

<code class="language-javascript">const { PI, E } = Math;</code>

使用Math.floor舍入數字

我們將要查看的下一個方法是Math.floor。這始終將值向下舍入到下面的整數(名稱意味著數字被向下推到“地板”):

<code class="language-javascript">Math.round(2.3); // 因为更接近2,所以向下舍入

Math.round(2.921); // 因为更接近3,所以向上舍入

Math.round(2.5); // 因为正好位于中间,所以向上舍入

Math.round(PI);

Math.round(E);</code>

Math.floor的一個常見用法是創建隨機整數。向下舍入確保整數從零開始,並且每個整數都有相同的被返回的機會。從零開始通常很有用,因為JavaScript中的數組是零索引的,因此向下舍入將確保可以選擇數組中的第一個元素。下面的示例顯示瞭如何使用Math.floor從數組中選擇一個隨機元素:

<code class="language-javascript">const test1 = 86;
const test2 = 93;
const test3 = 95;
const average = Math.round((test1 + test2 + test3) / 3);</code>

上面的代碼中使用Math.floor向下舍入確保返回0到4之間的索引,因此數組中的每個元素都有相同的被選擇的機會。

使用Math.ceil舍入數字

說到向上舍入,這正是Math.ceil所做的。這個名稱來自“天花板”,與“地板”相反,這意味著值正在上升。此方法的工作方式與所有其他方法相同。只需提供要向上舍入的數字作為參數:

<code class="language-javascript">Math.floor(2.3); // 向下舍入到2

Math.floor(2.921); // 向下舍入到2

Math.floor(2.5); // 向下舍入到2

Math.floor(PI);

Math.floor(E);</code>

但是,您何時需要向上舍入一個數字呢?一個常見的用法是,如果您需要計算需要多少個容器來容納某物。例如,假設您有一個包含播放列表的音樂網站,每個播放列表包含十首歌曲。如果有人上傳了82首歌曲,您需要計算出要創建多少個播放列表。這是通過將歌曲數量除以10(每個播放列表中的歌曲數量)來完成的:

<code class="language-javascript">const fruit = ["?", "?", "?", "?", "?"];

const randomFruit = fruit[Math.floor(Math.random() * fruit.length)];</code>

使用Math.round會將其向下舍入到8……但是,我們不會為最後兩首歌曲創建一個播放列表!在這種情況下,我們始終需要向上舍入,以便為任何餘數提供額外的容器:

<code class="language-javascript">Math.ceil(2.3); // 向上舍入到3

Math.ceil(2.921); // 向上舍入到3

Math.ceil(2.5); // 向上舍入到3

Math.ceil(PI);

Math.ceil(E);</code>

使用Math.trunc舍入數字

我們將要查看的下一個方法是Math.trunc。嚴格來說,這不是一個舍入函數;它實際上是截斷提供的參數數字。它基本上只是刪除數字的小數部分,只留下整數部分,如下面的示例所示:

<code class="language-javascript">const PI = Math.PI;
const E = Math.E;</code>

乍一看,Math.trunc似乎與Math.floor相同;當然,到目前為止給出的所有示例都給出了相同的結果。但是,當提供負值作為參數時,這兩種方法的行為有所不同,如下面的示例所示:

<code class="language-javascript">const { PI, E } = Math;</code>

差異發生是因為,當使用Math.floor向下舍入負數時,它會向下舍入到下一個最小的整數,而截斷負值等效於將其向上舍入。

當參數為負數時,Math.ceil返回與Math.trunc相同的值:

<code class="language-javascript">Math.round(2.3); // 因为更接近2,所以向下舍入

Math.round(2.921); // 因为更接近3,所以向上舍入

Math.round(2.5); // 因为正好位于中间,所以向上舍入

Math.round(PI);

Math.round(E);</code>

所有這些方法都非常有用,但它們有一個局限性,即它們始終返回整數值。如果我們想將數字舍入到特定的小數位數或有效數字怎麼辦?

在JavaScript中將數字舍入到小數位

我們已經看到Math.round會將數字舍入到最接近的整數。不幸的是,Math對像沒有提供任何方法可以更精確地將數字舍入到特定的小數位數。幸運的是,Number類型有一些內置方法可以做到這一點。讓我們來看看它們。

使用Number.toFixed舍入到小數位

這是一個數字方法,這意味著它由數字本身調用。它將十進制數舍入到給定的小數位數,該小數位數作為參數提供:

<code class="language-javascript">const test1 = 86;
const test2 = 93;
const test3 = 95;
const average = Math.round((test1 + test2 + test3) / 3);</code>

需要注意的一點是,該值作為字符串返回。您可以通過將方法調用包裝在Number函數中來解決此問題,這會將結果轉換回數字:

<code class="language-javascript">Math.floor(2.3); // 向下舍入到2

Math.floor(2.921); // 向下舍入到2

Math.floor(2.5); // 向下舍入到2

Math.floor(PI);

Math.floor(E);</code>

還要注意:如果您嘗試將此方法應用於已經是整數的數字,則如果只使用單個點調用該方法,則會出錯:

<code class="language-javascript">const fruit = ["?", "?", "?", "?", "?"];

const randomFruit = fruit[Math.floor(Math.random() * fruit.length)];</code>

您不能使用單個點在整數上調用方法,因為不清楚點是方法調用運算符還是小數點。要解決此問題,您可以將整數放在括號中或使用兩個點,以便清楚地表明您正在調用方法而不是編寫帶有小數點的數字文字:

<code class="language-javascript">Math.ceil(2.3); // 向上舍入到3

Math.ceil(2.921); // 向上舍入到3

Math.ceil(2.5); // 向上舍入到3

Math.ceil(PI);

Math.ceil(E);</code>

如果沒有提供參數,則數字將舍入到最接近的整數(但作為字符串返回):

<code class="language-javascript">const songsPerPlaylist = 10;
const numberOfSongs = 82;
const numberOfPlaylists = numberOfSongs / songsPerPlaylist;</code>

舍入到設定的幾位小數的一個常見用例是處理貨幣——例如,如果您想以最接近美分的美元提供某物的價格。假設您有一個電子商務網站,正在進行促銷活動,購物車中的任何商品都可享受15%的折扣。在顯示折扣價格之前,可能需要對其進行舍入:

<code class="language-javascript">const numberOfPlaylists = Math.ceil(numberOfSongs / songsPerPlaylist);</code>

這可以使用Number.toFixed輕鬆修復:

<code class="language-javascript">Math.trunc(2.3); // 只留下2

Math.trunc(2.921); // 只留下2,即使它更接近3

Math.trunc(2.5); // 只留下2

Math.trunc(PI);

Math.trunc(E);</code>

注意:有關您可能遇到的toFixed()問題的更多信息,請參閱Number().toFixed()舍入錯誤:已損壞但可修復。

使用Number.toPrecision舍入到小數位

Number.toPrecision方法的工作方式類似於Number.toFixed方法,但它將數字舍入到固定數量的有效數字。

如果您需要快速提醒有效數字,它基本上意味著只使用第一個非零數字。對於大數,最終答案也將用零填充。例如,舍入到兩位有效數字的數字53,863將變為54,000。這是因為5和3是前兩位非零數字,並且由於下一個數字是8,所以它向上舍入。我們需要在末尾添加零以確保舍入值是原始數字的合理近似值。

您也可以以類似的方式舍入小數。例如,0.00000623978將舍入到0.0000062到兩位有效數字,因為6和2是前兩位非零數字,並且由於下一個數字是3,所以它向下舍入。

要使用此方法,只需在數字上調用它,並提供有效數字的數量作為參數(記住,整數需要在調用它們之前放在括號中):

<code class="language-javascript">const PI = Math.PI;
const E = Math.E;</code>

請注意,所有值都作為字符串返回,並且可以使用指數表示法——例如“5.4e 4”而不是“54000”。

如前所述,我們可以通過將方法調用包裝在Number函數中來確保返回一個數字:

<code class="language-javascript">const { PI, E } = Math;</code>

舍入到給定有效數字的一個常見用途是當您處理大數並且不確定它們到底有多大時。例如,假設您想報告最新帖子被“點贊”的次數,您是將其舍入到最接近的10、100還是1000?在某種程度上,這取決於它的流行程度;如果它只獲得8個贊,您不希望將其舍入到最接近的100,但如果它獲得數千個贊,那麼將其舍入到最接近的10似乎很愚蠢。解決方案是將其舍入到一位有效數字:

<code class="language-javascript">Math.round(2.3); // 因为更接近2,所以向下舍入

Math.round(2.921); // 因为更接近3,所以向上舍入

Math.round(2.5); // 因为正好位于中间,所以向上舍入

Math.round(PI);

Math.round(E);</code>

JavaScript中舍入數字的問題

在JavaScript(或任何編程語言)中舍入數字時,需要注意一些事項。正如您可能知道的那樣,計算機將所有數據(包括數字)存儲為二進製表示。 JavaScript將數字存儲為32位單精度二進制值。

這樣做的一個問題是,某些十進制數無法在二進制中精確表示。這通常不會造成任何問題,但它確實會導致一些奇怪的結果,例如:

<code class="language-javascript">const test1 = 86;
const test2 = 93;
const test3 = 95;
const average = Math.round((test1 + test2 + test3) / 3);</code>

這是因為0.1和0.2無法在二進制中精確表示,並且在將它們相加時會產生輕微的誤差。

Math對像有另一個稱為fround的方法,它返回可以使用32位表示的最接近的數字。例如,0.6125可以精確地表示為二進制0.101,因此這將返回相同的值:

<code class="language-javascript">Math.floor(2.3); // 向下舍入到2

Math.floor(2.921); // 向下舍入到2

Math.floor(2.5); // 向下舍入到2

Math.floor(PI);

Math.floor(E);</code>

但是,正如我們上面看到的,0.1無法在32位中精確表示。 Math.fround向我們顯示了可以表示的最接近的數字:

<code class="language-javascript">const PI = Math.PI;
const E = Math.E;</code>

如您所見,它非常接近0.1,但非常略高。在大多數實際情況下,這不會造成任何問題,但當您嘗試舍入某些數字時,它偶爾會造成一些奇怪的行為:

<code class="language-javascript">const { PI, E } = Math;</code>

發生這種情況是因為十進制3.55無法使用32位精確表示。我們可以使用Math.fround來查看它的實際表示方式:

<code class="language-javascript">Math.round(2.3); // 因为更接近2,所以向下舍入

Math.round(2.921); // 因为更接近3,所以向上舍入

Math.round(2.5); // 因为正好位于中间,所以向上舍入

Math.round(PI);

Math.round(E);</code>

如您所見,它實際上由浮點數3.549999952316284表示,它向下舍入到3.5。

JavaScript中舍入數字的這些問題並不經常發生,但是如果您正在進行大量舍入,尤其是在結果必須準確的情況下,您絕對應該注意這些問題。

我應該使用哪些舍入數字的方法?

有了本文中介紹的所有捨入方法,您可能會問哪種方法最好用。答案總是“這取決於”。

如果您只想將數字舍入到最接近的整數,那麼使用Math.round不會出錯,但是如果您始終希望向下或向上舍入,而不管小數部分是什麼,您也應該考慮使用Math.floorMath.ceil。如果您還計劃舍入負數,請考慮改用Math.trunc

如果您需要捨入到給定的小數位數或有效數字,則必須使用Number.toFixedNumber.toPrecision。但請注意,這兩個方法都是由數字調用的,並返回一個字符串。

您可以在下面的CodePen演示中看到本文中介紹的所有不同類型的捨入示例。

CodePen演示鏈接

有了所有這些不同的方法,您以後應該不會再有捨入數字的問題了。

如果您覺得這篇文章有用,您可能還會喜歡這些:

  • JavaScript數字趣聞
  • 快速提示:如何在JavaScript中將數字轉換為序數

關於在JavaScript中舍入數字的常見問題解答

如何在JavaScript中將數字舍入到最接近的整數?您可以使用Math.round()函數將數字舍入到最接近的整數。例如,Math.round(3.14)將得到3,Math.round(4.76)將得到5。

Math.round()Math.floor()Math.ceil()有什麼區別? Math.round()舍入到最接近的整數,Math.floor()向下舍入到最接近的整數,Math.ceil()向上舍入到最接近的整數。

我可以將數字舍入到特定的小數位數嗎?是的,您可以使用toFixed()方法將數字舍入到特定的小數位。例如,let roundedNumber = 3.14159.toFixed(2)將得到3.14。

Math.round()如何處理具有.5小數部分的數字? Math.round()使用“四捨五入”邏輯,這意味著當小數部分正好為.5時,它會舍入到最接近的偶數整數。例如,Math.round(2.5)的結果為2,Math.round(3.5)的結果為4。

我可以使用Math.round()舍入正數和負數嗎?是的,Math.round()適用於正數和負數。它像往常一樣舍入正數,並將負數舍入到零。

JavaScript中會發生舍入錯誤嗎?是的,由於計算機中浮點運算的工作方式,可能會發生舍入錯誤。務必注意潛在的精度問題,尤其是在處理非常大或非常小的數字時。在這種情況下,請考慮使用像decimal.js這樣的庫來進行更精確的算術運算。

以上是JavaScript中舍入數字的指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn