ä»»ä½å ç¨ä½æ°æéçæ°åç¼ç ç³»ç»ï¼æ è®ºä½ éæ©çæ¯ä»ä¹åºæ°ï¼ä¾å¦åè¿å¶æäºè¿å¶ï¼ï¼é½å¿
宿 æ³ç²¾ç¡®è¡¨ç¤ºæææ°åï¼å ä¸ºä½ è¯å¾ä½¿ç¨æéçå
åæ¥è¡¨ç¤ºæ°è½´ä¸æ éæ°éçç¹ãä¾å¦ï¼åè¿å¶ç³»ç»æ æ³å确表示 1/3ï¼èäºè¿å¶ç³»ç»æ æ³å确表示 0.1
ãå æ¤ï¼ä¾å¦ï¼0.1 + 0.2
å¹¶ä¸å®å
¨çäº 0.3
ï¼
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false
å æ¤ï¼é常建议ä¸è¦ä½¿ç¨ ===
æ¯è¾æµ®ç¹æ°ãç¸åï¼æä»¬å¯ä»¥è®¤ä¸ºä¸¤ä¸ªæ°å¨å½¼æ¤ä¹é´æ¯è¶³å¤æ¥è¿çæ¶åå®ä»¬æ¯ç¸ççãå¦æç®æ¯è¿ç®çæ°éçº§å¨ 1
éè¿ï¼é£ä¹ Number.EPSILON
常æ°é常æ¯ä¸ä¸ªåçç误差éå¼ï¼å 为å®è´¨ä¸ï¼EPSILON
æå®äºæ°åâ1âç精确度ã
function equal(x, y) {
return Math.abs(x - y) < Number.EPSILON;
}
const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
ç¶èï¼å¯¹äºä»»ä½å
·ææ´å¤§æ°é级çç®æ¯è¿ç®ï¼Number.EPSILON
æ¯ä¸éç¨çãå¦æä½ çæ°æ®æ°éçº§å¨ 103 çèå´ï¼é£ä¹å°æ°é¨åç精确度å°è¿è¿å°äºNumber.EPSILON
ï¼
function equal(x, y) {
return Math.abs(x - y) < Number.EPSILON;
}
const x = 1000.1;
const y = 1000.2;
const z = 2000.3;
console.log(x + y); // 2000.3000000000002ï¼è¯¯å·®ä¸º 10^-13 è䏿¯ 10^-16
console.log(equal(x + y, z)); // false
å¨è¿ç§æ
åµä¸ï¼éè¦æ´å¤§ç容差ãç±äºè¿è¡æ¯è¾çæ°åçæ°é级大约为 2000
ï¼ä½¿ç¨ç±»ä¼¼äº 2000 * Number.EPSILON
çä¹ç§¯å¯ä»¥ä¸ºæ¤æ
嵿ä¾è¶³å¤ç容差ã
function equal(x, y, tolerance = Number.EPSILON) {
return Math.abs(x - y) < tolerance;
}
const x = 1000.1;
const y = 1000.2;
const z = 2000.3;
console.log(equal(x + y, z, 2000 * Number.EPSILON)); // true
é¤äºæ°é级ä¹å¤ï¼èèè¾å
¥ç精度ä¹é常éè¦ãä¾å¦ï¼å¦ææ°åæ¯ä»è¡¨åè¾å
¥æ¶éçï¼å¹¶ä¸è¾å
¥å¼åªè½ä»¥ 0.1
çæ¥é¿è°æ´ï¼å³ <input type="number" step="0.1">
ï¼ï¼é常å¯ä»¥å
许æ´å¤§ç容差ï¼ä¾å¦ 0.01
ï¼å ä¸ºæ°æ®çç²¾åº¦åªæ 0.1
ã
夿³¨ï¼ éç¹æ¯ï¼ä¸è¦ç®åå°å° Number.EPSILON
ä½ä¸ºç¸çæ§æµè¯çéå¼ã使ç¨éåè¦æ¯è¾çæ°åçæ°é级å精度çéå¼ã
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4