簡體   English   中英

我在 javascript 中有一個關於 Math.round() 的非常簡單的問題

[英]I hava a very simple question about Math.round() in javascript

代碼:

 let result; result = 2.4999999999999998; console.log(Math.round(result)); result = 2.4999999999999997; console.log(Math.round(result));

舍入點不是5? (雖然我知道JavaScript中的數字總是占用memory的64位,JavaScript中最多可以定義顯示15位integer位和17位小數位的數字。)為什么在控制台的結果是:

結果在控制台

我預計兩者都是:3

您的輸入值的精度位數超過了 JS 浮點數所能容納的精度,因此最后一位數字被四舍五入為最接近的二進制值。 這導致第一個被讀取為2.5 ,並且Math.round()將其四舍五入為 3。

您可以通過在四舍五入之前打印result的值來看到這一點。

 let result; result = 2.4999999999999998; console.log(result, Math.round(result)); result = 2.4999999999999997; console.log(result, Math.round(result));

2.4999999999999998末尾的額外 1 導致它太接近 2.5,JavaScript 無法識別差異。

 const withEight = 2.4999999999999998; console.log(2.4999999999999998 === 2.5)

所以Math.round(2.4999999999999998)Math.round(2.5)相同。

而且,正如規范所要求的那樣,當一個數字恰好在兩個整數之間時,較高的 integer 是首選。

  1. 返回最接近 n 的整數 Number,在平局的情況下更喜歡接近 +∞ 的 Number。

所以3是結果。

令人驚訝的行為與Math.round()並沒有真正的關系。 舍入已經在解析數字文字時發生,您可以通過直接回顯數字而不進行任何顯式舍入來查看它:

> 2.4999999999999998
2.5
> 2.4999999999999997
2.4999999999999996 

所以第一個數字向上舍入,第二個向下舍入 - 但不符合小數舍入的通用規則!

問題是數字文字被轉換為 64 位浮點數。 這具有 53 個二進制數字的精度。 因此,輸入數字四舍五入到最接近的可以用 53 個二進制數字表示的數字。

2.4999999999999996 的二進制表示為:

10.011111111111111111111111111111111111111111111111111

這是 53 個有效的二進制數字,因此下一個更高的二進制數是:

10.1

這是十進制的 2.5。

因此 2.4999999999999996 和 2.5 之間的數字不能精確表示,必須向上或向下舍入以適應浮點格式。

Math.round() 操作的結果很簡單:2.5 向上舍入為 3,2.4999999999999997 向下舍入為 2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM