源起


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实现个任意位正小数,向上进位相关推荐

  1. 10进制小数转化为任意进制小数

    将任意十进制正小数分别转换成2,3,4,5,6,7,8,9进制正小数,小数点后保留8位,并输出.例如:若十进制小数为0.795,则输出: 十进制正小数 0.795000 转换成 2 进制数为: 0.1 ...

  2. html 正则表达式验证金额,js金额校验,js正则表达式,包含正负,小数点后两位...

    js金额校验,js正则表达式,包含正负,小数点后两位,js代码如下: function isMoney(s) { //金额 只允许正数 //var exp = /(^[1-9]([0-9]+)?(\. ...

  3. 正则表达式-验证带千分号的,带任意位小数的数字类型

    ^[-+]?(\d+(\.\d*)?|\.\d+)[dD]?$ 可以带正负号的,任意位小数的实数 (\d*(,\d{3})*(.(\d{3},)*\d+)?) 不带正负号,可以带任意位小数的实数,但是 ...

  4. Java 十进制正小数转为其他进制正小数(小数点后保留10位)

    N进制小数 题目描述: 编写程序实现将任意10进制正小数m转换成n进制的正小数,小数点后保留10位小数 解答要求: 时间限制1000ms,内存限制64ms 输入: 输入包含两个数m.n,用空格隔开.输 ...

  5. 【51单片机快速入门指南】2.2:任意位/任意长度数码管显示数字、小数

    目录 源码 Tube.c Tube.h main.c 效果 8位数码管 正整数 负整数 正小数 负小数 6位数码管 正整数 负整数 正小数 负小数 4位数码管 正整数 负整数 正小数 负小数 普中51 ...

  6. python小数点后任意位_Python计算开方、立方、圆周率,精确到小数点后任意位的方法...

    Python计算的位数 在电脑上做了一个实验,看看python能计算到多少位,一下是结果. x = math.sqrt((3)) print ("%.53f"%(x)) print ...

  7. JS 四舍五入保留两位小数

    Html 四舍五入保留两位小数: Html: <input type="number" step=".01" id="amount" ...

  8. Python计算开方、立方、圆周率,精确到小数点后任意位

    Python计算的位数 在电脑上做了一个实验,看看python能计算到多少位,一下是结果. x = math.sqrt((3)) print ("%.53f"%(x)) print ...

  9. js 小数取整,js 小数向上取整,js小数向下取整

    js 小数取整,js 小数向上取整,js小数向下取整 >>>>>>>>>>>>>>>>>>& ...

最新文章

  1. Request库的安装与使用
  2. bash中 21 的解释
  3. python调用数据库数据创建函数_Pyhton应用程序数据库函数封装
  4. excel 区间人数柱状图_Excel中,区间统计的3种技巧都不掌握,那就真的OUt了!
  5. C#LeetCode刷题-哈希表
  6. python的matplotlib库怎么安装_为Python安装matplotlib库
  7. ASP.NET Core部署到CentOS7,使用Nginx代理
  8. vscode 更改中办发文_如何在Visual Studio代码或VSCode中更改集成终端
  9. wifi无线设备服务器驱动,如何安装Windows 10的WiFi驱动程序
  10. iPhone 14来了,苹果13和14区别,值不值得买
  11. vue3+ts+vant移动端H5项目搭建
  12. 千人规模互联网公司研发效能成功之路
  13. 使用vue-wordcloud实现文字云/词云
  14. 新款趣味测试小程序源码_测试可用
  15. 网络安全“全面防”,应对难以察觉的网络威胁!
  16. 使用条件分布模态流进行多变量概率时序预测
  17. 映客直播技术实战:直播平台的数据库架构演变
  18. 作文 深海机器人_海底机器人作文500字
  19. r7 7735h和r5 5560U差距 锐龙r77735h和r55560U对比
  20. 最小元素法求运输问题初始可行解

热门文章

  1. RT-thread实现USB虚拟U盘 模拟读卡器读写sd0
  2. 2014年3月21日51CTO微软MVP聚会照片
  3. 这位程序员的桌面是我见过最漂亮的了
  4. 友谊:铭记恩惠忘记伤害
  5. java垃圾回收器有哪些_各种Java垃圾回收器的比较总结
  6. python小游戏:教你如何称霸朋友圈
  7. shell中的括号(小括号,中括号,大括号)
  8. python api调用 验证码_Python语言调用创蓝253短信验证码API文档
  9. 如何在Godot中使用自发光材质
  10. がいねんとれいさいのにちじょう