一个数字截取引发的精度问题(一)

上周有一个“收银台”的业务需要重构,其中有一个需求:

收益计算的结果,取小数点后两位但不进行四舍五入,若不足则补0。

看到这个需求你应该会第一个想到:

numberObj.toFixed([digits])

因为这个方法基本可以满足这个需求。但是当看到以前同事的方法时,感觉这个方法并不能完全满足:

/*** 截断小数点后几位* @val 数值* @pos 小数点后截断的位置*/cutOffDecimal(val, pos) {    // 把数字转换成字符串    val = val.toString()    let len = val.length    let index = val.indexOf('.')    let subVal = val; // 这是什么鬼?    if (index != -1) {      subVal = val.substring(0, index + pos +  1)    }    // 利用 toFixed 防止小数位达不到其位数要求    return Number(subVal).toFixed(pos)}

代码意思很明显,检测是否含有小数点,若有则用小数点的位置 + 精确的小数位置 + 1,因为substring最后一个位置不包括在内所以加1, 最后用toFixed补全。

他没有直接用toFixed,说明此方法不能直接满足。我查了一下API说明果然有猫腻:

The number is rounded if necessary

意思是此方法在必要时进行四舍五入,一看这个肯定不能直接满足此需求,我感觉上面代码写的也有点啰嗦,改写如下:

export function NumberPrecision(number,prec = 0){    if(typeof number != 'number' || Number.isNaN(number)){        console.error('Must be a number but not a NaN');        return;    }    return number.toFixed(prec + 1).slice(0,-1);}

1.类型判断,非数字以及NaN的则报错; 2.toFixed我没有直接取到目标位置,而是取到目标位置的下一个位置,这样就避免了该方法的四舍五入对结果造成的影响,然后再用slice截取字符串。

原文发布于微信公众号 - 前端黑板报(FeHeiBanBao)

原文发表时间:2017-03-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

让你比95%的人更懂Pythonic的内置模块:collections

Python的集合(collections)模块,为很多用其他方法很难实现的场景提供了解决方案。 本文我们将会学习该模块的抽象概念是如何产生的,日后处理不同问题...

1975
来自专栏CSDN技术头条

Python编程中的反模式

这篇文章收集了我在Python新手开发者写的代码中所见到的不规范但偶尔又很微妙的问题。本文的目的是为了帮助那些新手开发者渡过写出丑陋的Python代码的阶段。为...

2076
来自专栏程序员互动联盟

java到底和C++有啥区别?

作为一名C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且Java的语法无疑是非常熟悉的。事实上,Java本来就是从C++衍生出来的。 然而,C++和...

3686
来自专栏小俊博客

Nginx的location规则迷之匹配

Nginx,一个改变世界的软件,其作者是一个俄罗斯人,俗称毛子,在国人的印象中,是一群晚饭后牵着大灰熊在小区楼下散步的彪汉。能写出这般顺滑的软件,可谓是心有猛虎...

6322
来自专栏IT派

JavaScript 打怪升级 —— 把业务逻辑当练习题做

开发项目和出没社区有一段时间了,会遇上一些比较有印象业务需求。这些业务需求,可能是自己开发项目遇上的,可能是在社区看到的业务需求,或者其他情况接触到的需求,但是...

813
来自专栏xingoo, 一个梦想做发明家的程序员

《JavaScript语言精粹》—— 读书总结

话说这本书还是同学的推荐才读的,之前感觉这本书太薄了,不值得看,没想到小身材有大智慧,书中的内容总结的还是很到位的!所以就把最后几章,精华的部分整理整理。 优...

2719
来自专栏java一日一条

Java集合框架综述

近被陆陆续续问了几遍HashMap的实现,回答的不好,打算复习复习JDK中的集合框架,并尝试分析其源码,这么做一方面是这些类非常实用,掌握其实现能更好的优化我们...

881
来自专栏大数据文摘

超8千Star,火遍Github的Python反直觉案例集!

Python,是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性。

1022
来自专栏Python学习心得

​ Python爬虫--- 1.4 正则表达式:re库

原文链接:https://www.fkomm.cn/article/2018/7/20/19.html

1220
来自专栏TungHsu

这或许是对小白最友好的python入门了吧——3,数字处理

昨天那篇推文是不是太长了,以后为了大家能够更好地理解,所以我们还是写的少点,大家看完以后要好好练习哦! 不要在此处直接复制代码! 在Python中可以执行对整...

3126

扫码关注云+社区

领取腾讯云代金券