javaScript中Float精度计算
在项目中做了一个计算统计值的部分,实现过程是通过 javaScript 进行累加的。在测试时出现了一个很乖的问题,在此记录一下。
1. 问题背景
项目中有一个表格字段,数据类型是float的,在数据库中均以Decimal(10,2)的格式保存(也即有效数字为10,小数点为两位)。现在,要对该字段进行累加统计。
2. JavaScript实现
考虑到JavaScript中的数据是无类型的自动判断,因此没有多想,直接将这个字段循环累加,代码如下:
// 统计UFP值
RequireCount.prototype.addUFP = function(value) {this.count_ufp += value;
};
// 统计US总值
RequireCount.prototype.addUS = function(value) {this.count_US += value;
};
本以为很简单,但是在显示计算结果时,出现了让我感到纳闷的一幕:
数据库中的数据全部都是小数点为两位的数据,怎么会出现这么长的小数点位数(50.68000000000001),也不该出现.00000000001吧?
3. 查找资料
在JavaScript中,数值(浮点型)数据在存储时并不区分Number还是Float型,而是全部按照Float的类型来进行存储。存储方式为:整形部分的长度为10,小数部分位数为16;如果最后一位小数为0则用1代替(这个地方很难理解,为啥用1代替最后一位,具体解释是用1来代替有效数字位数)
4. 问题解释
在统计过程中,如果出现了两者相加出现整数(也即后面小数点部分都满整了,比如,3.45 + 2.55 = 6.00),这时,计算结果将代替为:6.0000000000000001而不是,6.00。因为根据以上资料的规定就是这么个意思。是不是很奇怪的规定,不知道为什么这么规定,需要以后深入了解。
5. 解决方式(根据目前情况,并非正确解决方案,请勿模仿)
因为,项目中的数据量不是很大,按照精度问题来说,后面的一大片零头不会影响前面的数据结果,故而使用了 toFixed方法截取所需要的部分:
<span style="font-size:18px;">var floatTest = 5.6849392174var needFloat = loatTest.toFixed(2)</span>
虽然,不是正确的解决方案,但是针对目前情况来讲,是一个适用的“解决方案”
6. 问题延展及终极解决方案
加法会出现此问题,我们自然就会想到减法运算,然后就是乘除运算。
对于乘法,这不能这么“大意大胆”的使用上面的方式,毕竟乘法可不是一点点的累加了,可以说是:失之毫厘谬以千里啊。
6.1 加法:
function add(value1, value2) {var r1, r2, m;try {r1 = value1.toString().split(".")[1].length;} catch (e) {r1 = 0;}try {r2 = value2.toString().split(".")[1].length;} catch (e) {r2 = 0;}m = Math.pow(10, Math.max(r1, r2));return (value1 * m + value2 * m) / m;
}
6.2 减法:
function Subtr(value1, value2) {var r1, r2, m, n;try {r1 = value1.toString().split(".")[1].length;} catch (e) {r1 = 0;}try {r2 = value2.toString().split(".")[1].length;} catch (e) {r2 = 0;}m = Math.pow(10, Math.max(r1, r2));// 动态控制精度长度n = (r1 >= r2) ? r1 : r2;return ((value1 * m - value2 * m) / m).toFixed(n);
}
6.3 乘法:
function multiple(value1, value2) {var m = 0, s1 = value1.toString(), s2 = value2.toString();try {m += s1.split(".")[1].length;} catch (e) {}try {m += s2.split(".")[1].length;} catch (e) {}return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}
6.4 除法:
function divider(value1, value2) {var t1 = 0, t2 = 0, r1, r2;try {t1 = value1.toString().split(".")[1].length;} catch (e) {}try {t2 = value2.toString().split(".")[1].length;} catch (e) {}with (Math) {r1 = Number(value1.toString().replace(".", ""));r2 = Number(value2.toString().replace(".", ""));return (r1 / r2) * pow(10, t2 - t1);}
}
javaScript中Float精度计算相关推荐
- C++中 float 精度详解
文章目录 站在巨人的肩膀上 分析 结论 站在巨人的肩膀上 关于C和C++中的基本数据类型int.long.long long.float.double.char.string的大小及表示范围 c++中 ...
- Javascript中LenB的计算(ASP)
<% '========================================================== '機能 :LenB '======================= ...
- PHP 精度计算问题(精确算法)
1. PHP 中的精度计算问题 当使用 php 中的 +-*/ 计算浮点数时, 可能会遇到一些计算结果错误的问题 这个其实是计算机底层二进制无法精确表示浮点数的一个 bug, 是跨域语言的, 比如 j ...
- Java中float和double精度
http://zhidao.baidu.com/question/344295417.html?seed=0 float与double的区别 单精度浮点数在机内占4个字节,用32位二进制描述. 双精度 ...
- double java 精度丢失_java中double和float精度丢失问题及解决方法
在讨论两位double数0.2和0.3相加时,毫无疑问他们相加的结果是0.5.但是问题总是如此吗? 下面我们让下面两个doubles数相加,然后看看输出结果: @Test public void te ...
- double取值范围 java_Java中float/double取值范围与精度
Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个 ...
- php 精度问题怎么解决,JavaScript 中精度问题以及解决方案
JavaScript 中的数字按照 IEEE 754 的标准,使用 64 位双精度浮点型来表示.其中符号位 S,指数位 E,尾数位M分别占了 1,11,52 位,并且在 ES5 规范 中指出了指数位E ...
- 在html中解决数字四舍五入,JavaScript四舍五入及精度丢失问题
在JS中使用数值计算时,经常会遇到未知的结果. 问题:用toFixed保留小数时,四舍五入规则不固定: 常见的解决思路:将小数放大为整数,进行四舍五入后,再缩小为小数. // 四舍五入(若要直接舍去, ...
- float 范围 java_Java中float/double取值范围与精度
Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个 ...
最新文章
- scala入门基础2
- vue-ueditor 后端配置项没有正常加载_揭秘Gannt后端集成问题该如何解决
- PL/Sql循序渐进全面学习教程(下)(ZT)
- Android程序App开机自启动
- MySQL表碎片化(Table Fragmentation)以及处理
- 用CUDA实现Bellman-Ford
- numpy——ravel()和flatten()
- python转c报错no module named_python异常No module named 'win32com'
- ios jsonkit 报错_iOS开源项目:JSONKit
- ROS笔记(12) Rviz
- LeetCode 49 Group Anagrams(字符串分组)
- 测试用例的八大设计方法
- java绘制图形_Java绘制图形
- 201912-4 区块链(CCF CSP认证)
- css 浮动 相对定位 绝对定位区别
- Apache commons digester简介说明
- Dreamweaver简单网页——HTML+CSS小米官网首页的设计与实现
- 软件工程中的数据流图
- 关于C++ 存储类型auto、register、static、extern、mutable
- 当下的力量实践手册读书笔记(1.29)