js实现个任意位正小数,向上进位 您所在的位置:网站首页 有小数点就进位的函数 js实现个任意位正小数,向上进位

js实现个任意位正小数,向上进位

2023-09-02 20:16| 来源: 网络整理| 查看: 265

源起

Math相关的api有很大的局限,对于一些精细化的计算,显示的无能为力!引入第三方库,因为种种原因,不是很合适,所以还是自己实现一个

思路 初看标题好抽象,完全不知道如何下手,可能读懂标题都难。现在我们先从解读标题开始。 1.任意位小数,这个很好理解,就是小数点后面是0或者多位。 2.截取一个合适的点,向上进位。比如原来是3位小数,我截取进度小数点后一位,向上进位。例子如下:‘2.336’,进位后是‘2.4’。同理,如果截取小数点后两位,向上进位,‘2.336’,进位后是‘2.34’。解读完标题后,还是没有思路,这个时候我们想到,算法的其中一个特性,无非是把具体的例子归纳成抽象的,把公共的抽离。从简单的例子入手,比如任意位小数,保留2位,第3位如果存在,向上进位! 1.按照上面的思路,‘2.336’直接变成‘2.34’,我们想到数学方法中的四舍五入,但是这里有点不一样,是向上进位,我们只能使用四舍五入的原理! 2.我们想到,我们只需要把2.336*1000,直接变成2336,2336我们只需要判断6是不是存在,如果存在,把2336变成2340,然后除以1000即可!方法不止这一个,思路也是一样,我们下面基于上述思路实现! 代码 ceilNum = (d, prex = 2) => { if (parseInt(d) == d) return d; let len = 1; let i = 0; while (parseInt(d) != d) { d = d * 10; len *= 10; i++; } let last = Math.abs(i 0) { d1 = d1 + Math.pow(10, (i - prex)); } d1 = d1 / len; return d1; } 代码解读 先判断d是不是整数,如果是整数,自动返回。如果不是整数,先通过while把d变成整数,len表示扩大了多少倍,i表示d是几位小数如果你的小数位数,小于等于需要取的精度,例如你需要精确到百分位,但是你小数是一位小数,那么last就是0,也就是不需要进一步做处理,直接除以len,缩小扩大的倍数即可。如果你的小数的位数,大于需要取的进度,这个时候我们需要把多余的位数减去,然后对应位置加1。d取模这个是关键,建议童鞋们好好分析,i-prex是小数比我们需要取的进度多的位数,通过d % (Math.pow(10, (i - prex))),我们获得了小数点需要取的进度后面的所有内容,也就是last,只是这个内容是放大多倍后的整数。接着,我们只需要把扩大后的d,和上面取出来的last,做差即可,获得了需要保留精度的小数扩大后的内容!然后,我们看last是不是存在,如果存在,说明我们处理了,需要向上进位,大家可以好好体会d1 = d1 + Math.pow(10, (i - prex)),这里不详细解释了!最后,我们把获得的d1,处理后的结果,缩小原先放大的倍数即可! 后言 遗留问题 1.方法还是略微有点复杂,其他人看这个方法会有点吃力,还有几个思路也可也实现,这里不展开了,有兴趣的童鞋可以自己去想想其他实现方法! 2.这个方法只能处理正小数,负小数处理方法会有点问题,大家可以自行完善!总结 1.当遇到一个问题,不知道如何下手的时候,请归纳总结! 2.文中遇到的方法是从特殊归纳到整体,找到特殊中的共性,抽离出来,方法就完成了! 3.遇到问题多思考,多写,这样才会进步!


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有