在项目中做了一个计算统计值的部分,实现过程是通过 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精度计算相关推荐

  1. C++中 float 精度详解

    文章目录 站在巨人的肩膀上 分析 结论 站在巨人的肩膀上 关于C和C++中的基本数据类型int.long.long long.float.double.char.string的大小及表示范围 c++中 ...

  2. Javascript中LenB的计算(ASP)

    <% '========================================================== '機能 :LenB '======================= ...

  3. PHP 精度计算问题(精确算法)

    1. PHP 中的精度计算问题 当使用 php 中的 +-*/ 计算浮点数时, 可能会遇到一些计算结果错误的问题 这个其实是计算机底层二进制无法精确表示浮点数的一个 bug, 是跨域语言的, 比如 j ...

  4. Java中float和double精度

    http://zhidao.baidu.com/question/344295417.html?seed=0 float与double的区别 单精度浮点数在机内占4个字节,用32位二进制描述. 双精度 ...

  5. double java 精度丢失_java中double和float精度丢失问题及解决方法

    在讨论两位double数0.2和0.3相加时,毫无疑问他们相加的结果是0.5.但是问题总是如此吗? 下面我们让下面两个doubles数相加,然后看看输出结果: @Test public void te ...

  6. double取值范围 java_Java中float/double取值范围与精度

    Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个 ...

  7. php 精度问题怎么解决,JavaScript 中精度问题以及解决方案

    JavaScript 中的数字按照 IEEE 754 的标准,使用 64 位双精度浮点型来表示.其中符号位 S,指数位 E,尾数位M分别占了 1,11,52 位,并且在 ES5 规范 中指出了指数位E ...

  8. 在html中解决数字四舍五入,JavaScript四舍五入及精度丢失问题

    在JS中使用数值计算时,经常会遇到未知的结果. 问题:用toFixed保留小数时,四舍五入规则不固定: 常见的解决思路:将小数放大为整数,进行四舍五入后,再缩小为小数. // 四舍五入(若要直接舍去, ...

  9. float 范围 java_Java中float/double取值范围与精度

    Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个 ...

最新文章

  1. scala入门基础2
  2. vue-ueditor 后端配置项没有正常加载_揭秘Gannt后端集成问题该如何解决
  3. PL/Sql循序渐进全面学习教程(下)(ZT)
  4. Android程序App开机自启动
  5. MySQL表碎片化(Table Fragmentation)以及处理
  6. 用CUDA实现Bellman-Ford
  7. numpy——ravel()和flatten()
  8. python转c报错no module named_python异常No module named 'win32com'
  9. ios jsonkit 报错_iOS开源项目:JSONKit
  10. ROS笔记(12) Rviz
  11. LeetCode 49 Group Anagrams(字符串分组)
  12. 测试用例的八大设计方法
  13. java绘制图形_Java绘制图形
  14. 201912-4 区块链(CCF CSP认证)
  15. css 浮动 相对定位 绝对定位区别
  16. Apache commons digester简介说明
  17. Dreamweaver简单网页——HTML+CSS小米官网首页的设计与实现
  18. 软件工程中的数据流图
  19. 关于C++ 存储类型auto、register、static、extern、mutable
  20. 当下的力量实践手册读书笔记(1.29)

热门文章

  1. 2018最炙手可热的行业--大数据就业方向和学习路线图详解!
  2. esp32连接阿里云物联网平台进行MQTT通信
  3. [转]基于SNS的文本数据挖掘
  4. Android studio 刮刮乐两种方法
  5. DeviceIoControl 函数详细解析
  6. PATL2_026 小字辈
  7. Java-面向对象进阶2
  8. 介绍一款Android小游戏--交互式人机对战五子棋
  9. C#获取指定controlName的控件;遍历控件,反射控件类型等
  10. 如何培养人际交往的能力