作为一名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处理浮点数一点思考的更多相关文章

  1. 关于html页面元素语义化的一点思考

    这几天在看招聘公告前端工程师的要求基本都附带了html语义化的要求,所以稍微关注了下这方面的知识.对于其中的一点就是要求页面元素在去除css样式之后还能有良好的布局引发了我一点思考.作为前端刚入门的我 ...

  2. [技术博客] 软工-Ruby on Rails前端工具链的配置以及对Web应用结构设计的一点思考

    一.相关工具链简介 HAML HAML是专门面向Ruby on Rails模版语法设计的一门标记语言,其结合RoR的views部分模版语法的特点,对原来的*.html.erb(嵌入Ruby代码的HTM ...

  3. js,java,浮点数运算错误及应对方法

    js,java浮点数运算错误及应对方法 一,浮点数为什么会有运算错误 IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换.算术格式以及方法. 现有存储介质都是2进制.2 ...

  4. 关于java异常的一点思考

    关于异常的一点思考 异常生命周期 异常的来源 所有的异常都是抛出来的 有底层api抛出的 有自定义抛出的 异常的处理 1, 运行时异常 不做任何处理仍可编译通过 不建议捕获(不建议用异常来做流程控制, ...

  5. MSSQL显错注入爆数字型数据的一点思考

    Title:MSSQL显错注入爆数字型数据的一点思考 --2011-02-22 15:23 MSSQL+ASP 最近在弄个站点,密码是纯数字的,convert(int,())转换出来不报错,也不知道其 ...

  6. 对dump脱壳的一点思考

    对dump脱壳的一点思考 偶然翻了一下手机日历,原来今天是夏至啊,时间过的真快.ISCC的比赛已经持续了2个多月了,我也跟着比赛的那些题目学了2个月.......虽然过程很辛苦,但感觉还是很幸运的,能 ...

  7. GeoJSON JS判断某一点是否在某一区域范围之内

    GeoJSON JS判断某一点是否在某一区域范围之内 算法: function isInPolygon(checkPoint, polygonPoints) { var counter = 0; va ...

  8. 关于linux kernel slab内存管理的一点思考

    linux kernel 内存管理是个很大的话题,这里记录一点个人关于slab模块的一点思考总结. 有些书把slab介绍成高速缓存,这会让人和cache,特别是cpu cache混淆,造成误解.sla ...

  9. js运算浮点数

    在js中做小数:9.3+0.3会发现,得到的结果并不是9.6,而是9.600000000000001.这是为什么? Javascript采用了IEEE-745浮点数表示法,这是一种二进制表示法,可以精 ...

随机推荐

  1. 洛谷 P2441 角色属性树

    题目描述 绪萌同人社是一个有趣的组织,该组织结构是一个树形结构.有一个社长,直接下属一些副社长.每个副社长又直接下属一些部长……. 每个成员都有一个萌点的属性,萌点属性是由一些质数的萌元素乘积构成(例 ...

  2. vue基础六

    列表渲染 1.v-for 我们用 v-for 指令根据一组数组的选项列表进行渲染. v-for 指令需要以 item in items 形式的特殊语法(也可以用of代替in), items是源数据数组 ...

  3. 极简Vue的异步组件函数

    export default new Router({ routes: [ { path: '/live', name: 'live', component: () => import('@/v ...

  4. flask中app.py: error: invalid choice: 'insert'........的问题

    在flask中,分为两种操作方式,url指向函数或者终端指向函数,最终目的就是让函数执行,触发方式不同.终端执行更加安全, 另外如果在终端执行的时候出现 : 就是说明 insert 没有在@ mana ...

  5. CPU、内存、磁盘三者的关系

    参考:https://blog.csdn.net/weini1111/article/details/70849332 cpu是大脑,计算数据用的. 内存是草稿纸,开着电脑一直都在用里边的数据,如果断 ...

  6. nginx logformat说明

    记录一下nginx logformat的相关说明 log_format格式变量:$remote_addr  #记录访问网站的客户端地址$remote_user  #远程客户端用户名$time_loca ...

  7. 2019杭电多校第四场hdu6623 Minimal Power of Prime

    Minimal Power of Prime 题目传送门 解题思路 先打\(N^\frac{1}{5}\)内的素数表,对于每一个n,先分解\(N^\frac{1}{5}\)范围内的素数,分解完后n变为 ...

  8. Java.util包教程

    java.util.ArrayDeque 类提供了可调整大小的阵列,并实现了Deque接口.以下是关于阵列双端队列的要点: 数组双端队列没有容量限制,使他们增长为必要支持使用. 它们不是线程安全的;如 ...

  9. Eureka 系列(05)消息广播(上):消息广播原理分析

    Eureka 系列(05)消息广播(上):消息广播原理分析 [TOC] 0. Spring Cloud 系列目录 - Eureka 篇 首先回顾一下客户端服务发现的流程,在上一篇 Eureka 系列( ...

  10. Scrapy框架: 基本命令

    1.创建爬虫项目 scrapy startproject [项目名称] 2.创建爬虫文件 scrapy genspider +文件名+网址 3.运行(crawl) scrapy crawl 爬虫名称 ...