js处理浮点数一点思考
作为一名web开发人员,如果我们做到了涉及到费用加加减减的需求 难免会遇到浮点数的计算,就会遇到浮点数精度误差的问题
假设场景:
1.接口给你的金额单位是分,页面需要展示的金额单位为元。 最后落档金额为分
2.需求可以输入优惠金额单位为元(即 用户可以输入浮点数)需要计算实付金额。
问题:
第一个场景中 因为金额经历了 从分-->元--->分的历程。 我们实现分到元的是除以100 从分到元是用的是乘以100。 看上去毫无破绽 没看出什么有什么逻辑问题。但是浮点数计算会有计算误差(相关原理,我就不赘述了) 举个例子
接口给的金额是128109分。我们做页面展示为1281.09元(分-->元)
这个时候 我们需要将数据落档了 需要将128109存入数据库 我们理所当然的用 1281.09*100 (元-->分) 然后我们发现了什么?
我们再parseInt取整一下,完了,变成128108了 少了一分钱!! 为了这个问题 看代码看到了大半夜 都没看出来 哪里少了一分钱。原来是浮点数计算的误差导致少了一分钱。
第二个场景会涉及到浮点数计算 那就更灾难了。0.1+0.2 不等于0.3的情况 相信大家都有所耳闻。
解决办法:
1.我个人觉得最好的解决办法是前端不做计算。只做展示。就是说 像第一种场景 别自己写 分-->元--->分,把项目这里取值全部直接去取接口返回的分。
2.但是我们没办法,前台可能会输入浮点数,我们只能处理。这个时候我们要将浮点数转为整数,避免掉浮点数的运算。等计算完再转为浮点数。
这里有一个注意点,我们需要先知道我们要计算的浮点数是多少位的。然后我们将浮点数乘以大于精度值的值再去做计算。换句话说 两位小数乘以1000,三位小数乘以10000.
再看会上面那个例子
因为我项目中只会存在两位小数。所以 我直接乘以了1000 再除以1000
那有的项目中可能浮点数的精度并不固定。这个时候我们需要将这个浮点数变成字符串,再通过字符切割函数,将这个数变成小数和整数部分。最后获取小数部分的长度。这样我们就能知道要乘以多少了。
转为整数后 在进行计算 最后别忘了再转为浮点数
js处理浮点数一点思考的更多相关文章
- 关于html页面元素语义化的一点思考
这几天在看招聘公告前端工程师的要求基本都附带了html语义化的要求,所以稍微关注了下这方面的知识.对于其中的一点就是要求页面元素在去除css样式之后还能有良好的布局引发了我一点思考.作为前端刚入门的我 ...
- [技术博客] 软工-Ruby on Rails前端工具链的配置以及对Web应用结构设计的一点思考
一.相关工具链简介 HAML HAML是专门面向Ruby on Rails模版语法设计的一门标记语言,其结合RoR的views部分模版语法的特点,对原来的*.html.erb(嵌入Ruby代码的HTM ...
- js,java,浮点数运算错误及应对方法
js,java浮点数运算错误及应对方法 一,浮点数为什么会有运算错误 IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换.算术格式以及方法. 现有存储介质都是2进制.2 ...
- 关于java异常的一点思考
关于异常的一点思考 异常生命周期 异常的来源 所有的异常都是抛出来的 有底层api抛出的 有自定义抛出的 异常的处理 1, 运行时异常 不做任何处理仍可编译通过 不建议捕获(不建议用异常来做流程控制, ...
- MSSQL显错注入爆数字型数据的一点思考
Title:MSSQL显错注入爆数字型数据的一点思考 --2011-02-22 15:23 MSSQL+ASP 最近在弄个站点,密码是纯数字的,convert(int,())转换出来不报错,也不知道其 ...
- 对dump脱壳的一点思考
对dump脱壳的一点思考 偶然翻了一下手机日历,原来今天是夏至啊,时间过的真快.ISCC的比赛已经持续了2个多月了,我也跟着比赛的那些题目学了2个月.......虽然过程很辛苦,但感觉还是很幸运的,能 ...
- GeoJSON JS判断某一点是否在某一区域范围之内
GeoJSON JS判断某一点是否在某一区域范围之内 算法: function isInPolygon(checkPoint, polygonPoints) { var counter = 0; va ...
- 关于linux kernel slab内存管理的一点思考
linux kernel 内存管理是个很大的话题,这里记录一点个人关于slab模块的一点思考总结. 有些书把slab介绍成高速缓存,这会让人和cache,特别是cpu cache混淆,造成误解.sla ...
- js运算浮点数
在js中做小数:9.3+0.3会发现,得到的结果并不是9.6,而是9.600000000000001.这是为什么? Javascript采用了IEEE-745浮点数表示法,这是一种二进制表示法,可以精 ...
随机推荐
- vue基础七
事件处理器 1.监听事件 可以用 v-on 指令监听 DOM 事件来触发一些 JavaScript 代码. <div id="example-1"> <butto ...
- 2019 TCO Round 1B——[ 状压DP ]
第一题是 EllysSki . 题意:给n个数,求两个方向的最长递减区间. 可以O(n). #include<cstdio> #include<cstring> #includ ...
- Linux终端提示符颜色设置
将以下语句添加到用户目录下的 .bashrc 文件中,然后执行 source .bashrc 使其立即生效. PS1='${debian_chroot:+($debian_chroot)}\[\033 ...
- PHP基础知识总结(三) 流程控制、函数、类对象和数据库
PHP基础语法 1.流程控制 条件语句:if elseif else / switch if($a == 1){ …… } elseif ($a == 2){ …… } else{ …… } 循环 ...
- Kubernetes 技能图谱skill-map
# Kubernetes 技能图谱 ## Container basics (容器技术基础)* Kernel* Cgroups* Userspace runtime* Image* Registry ...
- windows下Mysql5.7表名不区分大小写问题
前言 Windwos文件系统本身是不区分大小写的,但是Linux文件系统是支持大小写的.于是安装在Linux下的Mysql导出到windows下可能因为大小写问题导致错误,因此要开启window下My ...
- java遇到的问题
1.java 初始化泛型数组 public static <T> T[] toArray(java.util.List<T> src, Class<T> type) ...
- python:TypeError: main() takes 0 positional arguments but 1 was given
TypeError: main() takes 0 positional arguments but 1 was given def main(self): 括号里加上self就好了
- jsp页面间的传值方法
JSP页面间传递参数是经常需要使用到的功能,有时还需要多个JSP页面间传递参数.下面介绍一下实现的方法. (1)直接在URL请求后添加 如:< a href="thexuan.jsp? ...
- python_ 模块 json pickle shelve
一,什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的代码( ...