js实现个任意位正小数,向上进位
源起
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 <= prex ? 0 : d % (Math.pow(10, (i - prex))));let d1 = d - last;if (last > 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.遇到问题多思考,多写,这样才会进步!
js实现个任意位正小数,向上进位相关推荐
- 10进制小数转化为任意进制小数
将任意十进制正小数分别转换成2,3,4,5,6,7,8,9进制正小数,小数点后保留8位,并输出.例如:若十进制小数为0.795,则输出: 十进制正小数 0.795000 转换成 2 进制数为: 0.1 ...
- html 正则表达式验证金额,js金额校验,js正则表达式,包含正负,小数点后两位...
js金额校验,js正则表达式,包含正负,小数点后两位,js代码如下: function isMoney(s) { //金额 只允许正数 //var exp = /(^[1-9]([0-9]+)?(\. ...
- 正则表达式-验证带千分号的,带任意位小数的数字类型
^[-+]?(\d+(\.\d*)?|\.\d+)[dD]?$ 可以带正负号的,任意位小数的实数 (\d*(,\d{3})*(.(\d{3},)*\d+)?) 不带正负号,可以带任意位小数的实数,但是 ...
- Java 十进制正小数转为其他进制正小数(小数点后保留10位)
N进制小数 题目描述: 编写程序实现将任意10进制正小数m转换成n进制的正小数,小数点后保留10位小数 解答要求: 时间限制1000ms,内存限制64ms 输入: 输入包含两个数m.n,用空格隔开.输 ...
- 【51单片机快速入门指南】2.2:任意位/任意长度数码管显示数字、小数
目录 源码 Tube.c Tube.h main.c 效果 8位数码管 正整数 负整数 正小数 负小数 6位数码管 正整数 负整数 正小数 负小数 4位数码管 正整数 负整数 正小数 负小数 普中51 ...
- python小数点后任意位_Python计算开方、立方、圆周率,精确到小数点后任意位的方法...
Python计算的位数 在电脑上做了一个实验,看看python能计算到多少位,一下是结果. x = math.sqrt((3)) print ("%.53f"%(x)) print ...
- JS 四舍五入保留两位小数
Html 四舍五入保留两位小数: Html: <input type="number" step=".01" id="amount" ...
- Python计算开方、立方、圆周率,精确到小数点后任意位
Python计算的位数 在电脑上做了一个实验,看看python能计算到多少位,一下是结果. x = math.sqrt((3)) print ("%.53f"%(x)) print ...
- js 小数取整,js 小数向上取整,js小数向下取整
js 小数取整,js 小数向上取整,js小数向下取整 >>>>>>>>>>>>>>>>>>& ...
最新文章
- Request库的安装与使用
- bash中 21 的解释
- python调用数据库数据创建函数_Pyhton应用程序数据库函数封装
- excel 区间人数柱状图_Excel中,区间统计的3种技巧都不掌握,那就真的OUt了!
- C#LeetCode刷题-哈希表
- python的matplotlib库怎么安装_为Python安装matplotlib库
- ASP.NET Core部署到CentOS7,使用Nginx代理
- vscode 更改中办发文_如何在Visual Studio代码或VSCode中更改集成终端
- wifi无线设备服务器驱动,如何安装Windows 10的WiFi驱动程序
- iPhone 14来了,苹果13和14区别,值不值得买
- vue3+ts+vant移动端H5项目搭建
- 千人规模互联网公司研发效能成功之路
- 使用vue-wordcloud实现文字云/词云
- 新款趣味测试小程序源码_测试可用
- 网络安全“全面防”,应对难以察觉的网络威胁!
- 使用条件分布模态流进行多变量概率时序预测
- 映客直播技术实战:直播平台的数据库架构演变
- 作文 深海机器人_海底机器人作文500字
- r7 7735h和r5 5560U差距 锐龙r77735h和r55560U对比
- 最小元素法求运输问题初始可行解