《ES6标准入门(第3版)》学习笔记17:chapter_6 数值的扩展(二)

这是该系列的第17篇笔记!
5,EPSILON

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>EPSILON</title>
</head>
<body>
    
    <script>
    // ES6在Number对象上新增了一个“极小常量” —— Number.EPSILON
    console.log(Number.EPSILON);  // 2.220446049250313e-16
    console.log(Number.EPSILON.toFixed(20));  // 0.00000000000000022204
    
    // 引入目的:为浮点数计算设置一个误差范围

    console.log(0.1 + 0.2);
    console.log(0.1 + 0.2 - 0.3);
    
    // 如果误差小于这个Number.EPSILON,则认为得到的值是正确的
    console.log((0.1 + 0.2 - 0.3) < Number.EPSILON);  // true
    
    // 实质上,Number.EPSILON是一个可以接受的误差范围
        function withErrorMargin(left, right){
            return Math.abs(left - right) < Number.EPSILON;
        }
        console.log(withErrorMargin(0.1+0.2, 0.3));  // true
        console.log(withErrorMargin(0.2+0.2, 0.3));  // false




    
    </script>
</body>
</html>

6,安全整数和Number.isSafeInteger()

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>安全整数和Number.isSafeInteger()</title>
</head>

<body>

    <script>
        // JavaScript能够精确表示的整数范围在-2^53~2^53之间(不含两个端点),超过这个范围就无法精确表示
        // 超过2的53次方之后,一个数就不精确了
        console.log(Math.pow(2, 53)); // 9007199254740992
        console.log(9007199254740993); // 9007199254740992
        // 9007199254740993超出精度范围,导致计算机内部以9007199254740992的形式存储

        console.log(Math.pow(2, 53) === Math.pow(2, 53) + 1); // true

        // ES6引入两个常量:
        // Number.MAX_SAFE_INTEGER: 9007199254740991
        // Number.MIN_SAFE_INTEGER: -9007199254740991
        // 用来表示一个范围的上下限

        console.log(Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1) // true
        console.log(Number.MAX_SAFE_INTEGER === 9007199254740991); // true
        console.log(Number.MIN_SAFE_INTEGER === -9007199254740991); // true

        // Number.isSafeInteger() --> 判断一个整数是否落在上下限范围内

        // console.log(Number.isSafeInteger(Number.MIN_SAFE_INTEGER));
        // console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER));

        // 以下结果为false
        // console.log(Number.isSafeInteger(1.2));
        // console.log(Number.isSafeInteger(9007199254740993));
        // console.log(Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1));
        // console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1));
        // console.log(Number.isSafeInteger('a'));
        // console.log(Number.isSafeInteger(null));
        // console.log(Number.isSafeInteger(NaN));

        console.log('----------');

        // 实际使用这个函数时,需要注意验证运算结果是否落在安全整数的范围内,
        // 另外不能只验证运算结果,还有同时验证参与运算的每个值!!!

        // Number.isSafeInteger函数的实现1:(有缺陷)
        // Number.isSafeInteger = function (n) {
        //     return (
        //         typeof n === 'number' &&
        //         Math.round(n) === n &&
        //         Number.MIN_SAFE_INTEGER <= n &&
        //         n <= Number.MAX_SAFE_INTEGER);
        // }
        // console.log(Number.isSafeInteger(9007199254740993)); // false
        // console.log(Number.isSafeInteger(90.3)); // false
        // console.log(Number.isSafeInteger(900)); // true

        // console.log(Number.isSafeInteger(9007199254740993 - 990)); // true
        //只验证运算结果,没有验证参与运算的每个值,9007199254740993是超出精度范围!


        // Number.isSafeInteger函数的实现2(补充一个函数trusty):
        Number.isSafeInteger = function (n) {
            return (
                typeof n === 'number' &&
                Math.round(n) === n &&
                Number.MIN_SAFE_INTEGER <= n &&
                n <= Number.MAX_SAFE_INTEGER);
        }

        function trusty(left, right, result) {
            if (
                Number.isSafeInteger(left) &&
                Number.isSafeInteger(right) &&
                Number.isSafeInteger(result)
            ) {
                return result;
            }
            throw new RangeError('Operation cannot be trusted !');
        }
        // console.log(trusty(9007199254740993 ,  990 ,  9007199254740993  - 990));  // 报错       
        // 验证运算的结果,同时也验证参与运算的每个值!!!
        console.log(trusty(1, 2, 3));




    </script>
</body>

</html>

让学习“上瘾”,成为更好的自己!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值