问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用js编写一个成绩判断函数输入参数为从0到100的分数,单精度数。如果数字在0到60之间,不包括

发布网友 发布时间:2022-04-24 01:48

我来回答

2个回答

懂视网 时间:2022-04-24 06:09

分享一个js数字位数太大导致参数精度丢失的实例

最近遇到个比较奇怪的问题,js函数里传参,传一个位数比较大,打印arguments可以看到传过来的参数已经改变。

然后查了一下,发现确实是js精度丢失造成的。我的解决方法是将数字型改成字符型传输,这样就不会造成精度丢失了。如下图:

JS 数字丢失精度的原因

计算机的二进制实现和位数限制有些数无法有限表示。就像一些无理数不能有限表示,如 圆周率 3.1415926...,1.3333... 等。JS 遵循 IEEE 754 规范,采用双精度存储(double precision),占用 64 bit。如图

意义

  • 1位用来表示符号位

  • 11位用来表示指数

  • 52位表示尾数

  • 浮点数,比如

    0.1 >> 0.0001 1001 1001 1001…(1001无限循环)
    0.2 >> 0.0011 0011 0011 0011…(0011无限循环)

    此时只能模仿十进制进行四舍五入了,但是二进制只有 0 和 1 两个,于是变为 0 舍 1 入。这即是计算机中部分浮点数运算时出现误差,丢失精度的根本原因。

    大整数的精度丢失和浮点数本质上是一样的,尾数位最大是 52 位,因此 JS 中能精准表示的最大整数是 Math.pow(2, 53),十进制即 9007199254740992。

    大于 9007199254740992 的可能会丢失精度

    9007199254740992 >> 10000000000000...000 // 共计 53 个 0
    9007199254740992 + 1 >> 10000000000000...001 // 中间 52 个 0
    9007199254740992 + 2 >> 10000000000000...010 // 中间 51 个 0

    实际上

    9007199254740992 + 1 // 丢失
    9007199254740992 + 2 // 未丢失
    9007199254740992 + 3 // 丢失
    9007199254740992 + 4 // 未丢失

    结果如图

    以上,可以知道看似有穷的数字, 在计算机的二进制表示里却是无穷的,由于存储位数限制因此存在“舍去”,精度丢失就发生了。

    想了解更深入的分析可以看这篇论文(又长又臭):What Every Computer Scientist Should Know About Floating-Point Arithmetic

    三、解决方案

    对于整数,前端出现问题的几率可能比较低,毕竟很少有业务需要需要用到超大整数,只要运算结果不超过 Math.pow(2, 53) 就不会丢失精度。

    对于小数,前端出现问题的几率还是很多的,尤其在一些电商网站涉及到金额等数据。解决方式:把小数放到位整数(乘倍数),再缩小回原来倍数(除倍数

    // 0.1 + 0.2
    (0.1*10 + 0.2*10) / 10 == 0.3 // true

    热心网友 时间:2022-04-24 03:17

    <script>

    function check(arg){

    arg = parseFloat(arg);
    if(arg < 0 || arg > 100){
    return false;
    }
    if(arg <60){
    return '不及格';
    }
    if(arg >= 60 && arg < 80){
    return '及格';
    }
    if(arg >=80 && arg < 100){
    return '优良';
    }
    if(arg == 100){
    return '满分';
    }
    }

    window.onload = function(){
    alert(check(60));
    alert(check(80));
    alert(check(0));
    alert(check(100));
    }
    </script>
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 养宠物的人遵守规则,是不是就能和别人平安相处呢? 申请一个新的需要什么条件? 怎样申请注册 我支付宝的余额里面有钱,怎么还不了蚂蚁花呗 如何申请注册 我一个手机号注册了2个微信,但是其中一个密码忘记了,怎么登陆? 如何申请不用手机号注册 我一个手机号注册了2个微信,但是其中一个密码忘记了,怎么登陆 我前几天在超市里买了饺子放在冰箱里,今天发现饺子的面皮已经粘在了一起,请问该如何保存饺子? 现在可以申请新的吗? 一加2怎么使用moto360 moto 360 二代 怎么用 为什么tplogin.cn打不开,192.168.1.1也打不开?所有浏览器都是这样。 我想申请一个怎么申请的 怎么申请怎么注册 关于华为WS326无线路由器:状况:电脑能上,无线能上,手机连上,信号满,但不能上网 我用的华为那个自带路由功能的猫用笔记本连上了wifi,也显示网络信号很好,为什么还是上不了网,上什么... 我的学校是用H3C 802.1X 客户端的,但是最近因为换了电脑..结果上不到网了.错误提示是:IP地址绑定失败.谁知 怎么申请 注册 华为电脑无interest,安全怎么回事? 清真鲈鱼的味道用文字怎么表达? 现在可以申请新的吗? 自学python哪本书好一点 爱在灵灵久 灰色跟白色搭配的饮品叫什么名字好? 梦见爸妈知道老公丑陋的一面坚决要我离婚? 梦见老妈逼我和其他男人在一起和老公离婚? 梦见父母逼我离婚娶别人 九阳豆浆机e12故障? 环保处罚网上如何查 5岁的孩子到底能做多少个仰卧起坐? 被环保局查了怎么办 狼爸每天魔鬼训练5岁儿子超过4小时,孩子能受得了吗? 西岭雪山什么时候去最好,可以看雪景 西岭雪山什么时候开始有雪 个人汽车买卖合同协议书是否有效 本人js初学者,如何用js通过循环求一个数的位数 泡过的茶叶沥干水第二天能喝吗 天王星和金星哪个大? 金星和天王星哪个大? Excel中如何制作方格选项,点击后会自动打钩 金星和太阳系的八大行星的关系