[英]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 是首選。
- 返回最接近 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.