首先解决精度最便捷的方式:

x为要做精度处理的数值,先将x放大10000倍,再四舍五入,在除以10000倍。

Math.round(x*10000)/10000

(注意:这里乘的倍数和你要保留的小数位数相对应。比如要保留2位,则乘100倍;保留3位,则乘1000倍。)

该方法可以保证大部分情况下适用。

如果你要保证极其高的精度,则需要采用下面的方法处理。

--------------------------------------------------------------------------------------------------------------------------------------------

1,简介             Javascript中高精度计算,主要解决Javascript不精确问题,此解决方案包括,浮点数数计算出现不精确问题;浮点数计算中指定精度的方法。计算不精确通过 Arithmetic(函数)处理;指定精度通过FormatByAccuracy(函数)处理,这两个函数也是本实例中最主要的两个方法。可用于JS开发和.NET的ajax开发项目中。

2,实例

数量精度: 单价精度: 金额精度:

数量 单价 金额

3,code

[html] view plaincopy
  1. <pre class="html" name="code"><html>
  2. <head>
  3. <title>javascript高精度计算解决方案</title>
  4. <script language="javascript" type="text/javascript">
  5. function AutoCalculate(rowid,flag){
  6. /// <summary>自动计算数量、单价、金额</summary>
  7. /// <param name="obj">输入框控件</param>
  8. /// <param name="rowid">new rowid</param>
  9. /// <param name="flag">N数量P单价M金额</param>
  10. var objN = document.getElementById("txtN"+rowid);
  11. var objP = document.getElementById("txtP"+rowid);
  12. var objM = document.getElementById("txtM"+rowid);
  13. //取设置的精度
  14. var np = document.getElementById("txtNP").value;
  15. var pp = document.getElementById("txtPP").value;
  16. var mp = document.getElementById("txtMP").value;
  17. //check
  18. if(np>21||pp>21||mp>21)
  19. {
  20. alert('精度最大21!');
  21. return;
  22. }
  23. //数据精度处理
  24. objN.value = FormatByAccuracy(objN.value,np);
  25. objP.value = FormatByAccuracy(objP.value,pp);
  26. //进行计算
  27. if(flag=="N"){ //修改数量
  28. if(objN.value!=""){ //如果数量栏位值不为空
  29. if(objP.value != ""){ // 如果单价不为空,则重新计算金额
  30. objM.value = Arithmetic(objN.value,'*',objP.value);
  31. }else{
  32. if(objM.value!=""){ //如果单价为空,金额不为空,计算出单价
  33. if(objN.value!=0){//如果数量不为0
  34. objP.value = Arithmetic(objM.value,'/',objN.value);
  35. }
  36. }
  37. }
  38. }else{  //如果数量栏位值为空,则清空金额栏位。
  39. objM.value = "";
  40. }
  41. }else if(flag=="P"){//修改单价
  42. if(objP.value!=""){ //如果单价栏位值不为空
  43. if(objN.value!=""){ //如果数量栏位值不为空,重算金额栏位
  44. objM.value = Arithmetic(objN.value,'*',objP.value);
  45. }else{//数量栏位值为空,清空金额栏位
  46. objM.value = "";
  47. }
  48. }else{//如果单价栏位值为空
  49. if(objN.value!=""){ //如果数量栏位值不为空,清空金额栏位
  50. objM.value = "";
  51. }else{
  52. }
  53. }
  54. }else if(flag=="M"){//修改金额
  55. if(objM.value!=""){ //如果金额栏位值不为空
  56. if(objN.value!=""){ //如果数量栏位值不为空,重算单价栏位
  57. if(objN.value!="0"){//如果数量不为0
  58. objP.value = Arithmetic(objM.value,'/',objN.value);
  59. }
  60. }else{//数量栏位值为空,清空单价栏位
  61. objP.value = "";
  62. }
  63. }else{//如果金额栏位值为空
  64. if(objN.value!=""){ //如果数量栏位值不为空,清空单价栏位
  65. objP.value = "";
  66. }else{
  67. }
  68. }
  69. }
  70. //处理计算结果精度,有可能是算金额,有可能是算单价
  71. objP.value = FormatByAccuracy(objP.value,pp);
  72. objM.value = FormatByAccuracy(objM.value,mp);
  73. //计算合计金额
  74. CalculateSumMoney();
  75. }
  76. function CalculateSumMoney(){
  77. /// <summary>计算合计金额</summary>
  78. var objM = document.getElementsByName("txtM");
  79. var sumMoney =0;
  80. var m;
  81. for(var i=0;i<objM.length;i++){
  82. m = objM.item(i).value;
  83. if(m != ""){
  84. sumMoney = Arithmetic(sumMoney,'+',m);
  85. }
  86. }
  87. document.getElementById("txtSum").value = sumMoney;
  88. }
  89. function FormatByAccuracy(val,accuracy){
  90. /// <summary>浮点数精度处理</summary>
  91. /// <par accuracy>小数位精度</par>
  92. /// <bug>由于toPrecision是从第一个不为0的值开始处理精度,
  93. ///所以暂不考虑0.00000X(<0.01)的情况</bug>
  94. if(val){
  95. if(accuracy==0&&parseFloat(val)<1){
  96. return parseFloat(val).toPrecision();
  97. }else{
  98. val = Number(val).toString();
  99. index = val.indexOf('.');
  100. //len整数位精度
  101. len = index==-1?val.length:(val.substr(0,index)=='0'?index-1:index);
  102. accuracy = parseInt(len,10)+parseInt(accuracy,10);
  103. //toPrecision最大支持21位处理
  104. accuracy = accuracy>21?21:accuracy;
  105. return parseFloat(val).toPrecision(accuracy);
  106. }
  107. }else{
  108. return val;
  109. }
  110. }
  111. function Arithmetic(arg1,operator,arg2){
  112. ///<summary>四则运算,基本思路:转整计算然后恢复小数位</summary>
  113. ///<par>operator运算符</par>
  114. ///<result>计算结果</result>
  115. var r1,r2,mul,size;
  116. try{
  117. r1=arg1.toString().split(".")[1].length;
  118. }catch(e){
  119. r1=0;
  120. }
  121. try{
  122. r2=arg2.toString().split(".")[1].length;
  123. }catch(e){
  124. r2=0;
  125. }
  126. size = Math.max(r1,r2);
  127. switch(operator){
  128. case "+":
  129. case "-":
  130. mul = size;
  131. break;
  132. case "*":
  133. mul = 2 * size;
  134. break;
  135. case "/":
  136. mul = 0;
  137. break;
  138. }
  139. return eval((arg1*Math.pow(10, size)) + operator + (arg2*Math.pow(10, size))) / Math.pow(10, mul);
  140. }
  141. </script>
  142. </head>
  143. <body>
  144. <form id="form1" >
  145. <h3>简介</h3>
  146. Javascript中高精度计算,主要解决Javascript不精确问题,此解决方案包括,浮点数数计算出现不精确问题;浮点数计算中指定精度的方法。<br>计算不精确通过 Arithmetic(函数)处理;指定精度通过FormatByAccuracy(函数)处理,这两个函数也是本实例中最主要的两个方法。<br> 可用于JS开发和.NET的ajax开发项目中。</
  147. <hr>
  148. 数量精度:<input type="text" id="txtNP" value="1" />
  149. 单价精度:<input type="text" id="txtPP" value="1" />
  150. 金额精度:<input type="text" id="txtMP" value="1" />
  151. <table width="600" border="1" cellpadding="0" id="tblMats" cellspacing="0" >
  152. <tr height="20" align="center">
  153. <th  width="60px">数量</th>
  154. <th  width="60px">单价</th>
  155. <th  width="70px">金额</th>
  156. </tr>
  157. <tr height="21"  align="center">
  158. <td >
  159. <input width="40" type="text" id="txtN0" onblur="AutoCalculate(0,'N')" style="width:100%; text-align:right"  />
  160. </td>
  161. <td >
  162. <input width="40" type="text" id="txtP0" onblur="AutoCalculate(0,'P')" style="width:100%; text-align:right"  />
  163. </td>
  164. <td >
  165. <input width="40" type="text" name="txtM" id="txtM0" onblur="AutoCalculate(0,'M')" style="width:100%; text-align:right"  />
  166. </td>
  167. </tr>
  168. <tr height="21"  align="center">
  169. <td >
  170. <input width="40" type="text" id="txtN1" onblur="AutoCalculate(1,'N')" style="width:100%; text-align:right"  />
  171. </td>
  172. <td >
  173. <input width="40" type="text" id="txtP1" onblur="AutoCalculate(1,'P')" style="width:100%; text-align:right"  />
  174. </td>
  175. <td >
  176. <input width="40" type="text" name="txtM" id="txtM1" onblur="AutoCalculate(1,'M')" style="width:100%; text-align:right"  />
  177. </td>
  178. </tr>
  179. <tr height="21"  align="center">
  180. <td  colspan="8">
  181. <input type="text" id="txtSum" value="0"  readonly="readonly" style="width:100%;text-align:right; "  /></td>
  182. </tr>
  183. </table>
  184. </form>
  185. </body>
  186. </html>
  187. </pre>

javascript高精度计算解决方案相关推荐

  1. 简单易操作的跨浏览器JavaScript单元测试解决方案

    关于单元测试 前端的单元测试也可以称为自动化测试,测试驱动开发,单元测试对于前端模块化.框架和功能库的开发是非常有必要的,只要做好模块的解耦和功能划分,单元测试就可以愉快地进行.好的单元测试(全面的功 ...

  2. JavaScript 文件下载解决方案-download.js

    官方网站:http://danml.com/download.html 下载地址:http://danml.com/js/download2.js 环境测试 手机QQ: 通过 华为手机浏览器:通过 小 ...

  3. 深入理解javascript异步编程障眼法h5 web worker实现多线程

    0.从一道题说起 var t = true; setTimeout(function(){ t = false; }, 1000); while(t){ } alert('end'); 1 2 3 4 ...

  4. JavaScript标准参考教材(alpha)--笔记

    一.导论 二.基本语法 1.严格来说var a=1与a=1效果不太一样,delete命令无法删除前者. JavaScirpt是一种动态类型语言,也就是说,变量的类型没有限制,可以赋予各种类型的值. J ...

  5. 翻译 | 摆脱浏览器限制的JavaScript

    译者:安冬 (沪江Web前端开发工程师) 本文原创翻译,转载请注明作者及出处. 原文地址:http://developer.telerik.com/... 技术世界在发展,JavaScript也在同步 ...

  6. Google Maps——页面提示[For development purposes only]解决方案

    问题描述 填写Google Maps JavaScript API密钥之后,加载Google Maps JavaScript API会出现这样的显示: 问题解析 由于谷歌政策的变革,需要填写一些相关信 ...

  7. javascript 嵌入python_从Javascript代码调用Python函数

    I'd like to call a Python function from Javascript code, because there isn't an alternative in Javas ...

  8. 2016年度 JavaScript 展望(下)

    [编者按]本文作者为资深 Web 开发者 TJ VanToll, TJ 专注于移动端 Web 应用及其性能,是<jQuery UI 实践> 一书的作者. 本文系 OneAPM 工程师编译呈 ...

  9. Javascript模块化编程系列二: 模块化的标准化(CommonJS AMD)

    前言 Javascript模块化编程系列一: 模块化的驱动 在前一篇介绍了为什么要进行Javascript模块化编程.至于如何实现模块化,不同的开发组织和个人具体的实现方式肯定是不一样.如何统一一个规 ...

最新文章

  1. jmeter设置全局变量
  2. linux 文件打开数设置, too ma
  3. 通道控制方式,通道指令与通道程序
  4. 收藏 | 用 Keras 实现神经网络来解决梯度消失的问题
  5. UI设计超干货素材!小图标里的大学问!
  6. 三级网络-不单单是学知识
  7. 【已解决】请在位于当前 Web 应用程序根目录下的“web.config”配置文件中创建一个 <customErrors> 标记
  8. 实力验证,浪潮整机柜软件定义存储性能有“数”可依
  9. 通过代理截取并修改非对称密钥加密信息
  10. oracle dba_tables degree default,oracle中如何将表的并行度设定为DEFAULT?如下:
  11. 如何停止keepalived_systemctl无法停掉keepalived
  12. win10计算机删除了怎么恢复,Win10系统删除的文件怎么恢复?
  13. 念念不忘,必有回响:Powered By Typecho
  14. Java—mysql缓存导致查询结果与数据库不一致
  15. 重磅!京东云自研第四代云主机发布;曝国外物理学家开发出用于量子计算机的汇编语言...
  16. js中isNaN和Number.isNaN的区别
  17. 给CSDN小伙伴们带来一款好用的数据恢复——R-Studio v8.15
  18. 中国权证市场可行性及概念诠释
  19. Java中的this关键字(三种用法)
  20. Excel1——复制txt数据到Excel单元格并批量截取获得所需数据

热门文章

  1. datename mysql_SQL日期时间函数总结(MSSQL)
  2. EOS 智能合约源代码解读 (7)合约开发示例
  3. 初等数论--同余方程--二元一次不定方程的通解形式
  4. Opencv实战之图像的基本操作:这效果出来惊艳了众人(附代码解析)
  5. MySQL基本操作(表,字段)
  6. Boost Part III. 函数对象与高级编程 Library 10. Lambda 用法
  7. android classloader异常,Android中ClassLoader类加载机制
  8. notsequence 寒假逆向生涯(9/100)
  9. 带你了解什么样的信息是陷阱或为勒索病毒在诱骗
  10. 程序员面试拼多多,来看看这些面试题你掌握的有多少呢?