转载自:http://blog.csdn.net/zhutulang/article/details/6844834#comments

Java:

  1. import java.math.BigDecimal;
  2.  
  3. /**
  4. * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
  5. * 确的浮点数运算,包括加减乘除和四舍五入。
  6. */
  7.  
  8. public class Arith{
  9. //默认除法运算精度
  10. private static final int DEF_DIV_SCALE = 10;
  11. //这个类不能实例化
  12. private Arith(){
  13. }
  14.  
  15. /**
  16. * 提供精确的加法运算。
  17. * @param v1 被加数
  18. * @param v2 加数
  19. * @return 两个参数的和
  20. */
  21. public static double add(double v1,double v2){
  22. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  23. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  24. return b1.add(b2).doubleValue();
  25. }
  26. /**
  27. * 提供精确的减法运算。
  28. * @param v1 被减数
  29. * @param v2 减数
  30. * @return 两个参数的差
  31. */
  32. public static double sub(double v1,double v2){
  33. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  34. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  35. return b1.subtract(b2).doubleValue();
  36. }
  37. /**
  38. * 提供精确的乘法运算。
  39. * @param v1 被乘数
  40. * @param v2 乘数
  41. * @return 两个参数的积
  42. */
  43. public static double mul(double v1,double v2){
  44. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  45. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  46. return b1.multiply(b2).doubleValue();
  47. }
  48.  
  49. /**
  50. * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
  51. * 小数点以后10位,以后的数字四舍五入。
  52. * @param v1 被除数
  53. * @param v2 除数
  54. * @return 两个参数的商
  55. */
  56. public static double div(double v1,double v2){
  57. return div(v1,v2,DEF_DIV_SCALE);
  58. }
  59.  
  60. /**
  61. * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
  62. * 定精度,以后的数字四舍五入。
  63. * @param v1 被除数
  64. * @param v2 除数
  65. * @param scale 表示表示需要精确到小数点以后几位。
  66. * @return 两个参数的商
  67. */
  68. public static double div(double v1,double v2,int scale){
  69. if(scale<0){
  70. throw new IllegalArgumentException(
  71. "The scale must be a positive integer or zero");
  72. }
  73. BigDecimal b1 = new BigDecimal(Double.toString(v1));
  74. BigDecimal b2 = new BigDecimal(Double.toString(v2));
  75. return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
  76. }
  77.  
  78. /**
  79. * 提供精确的小数位四舍五入处理。
  80. * @param v 需要四舍五入的数字
  81. * @param scale 小数点后保留几位
  82. * @return 四舍五入后的结果
  83. */
  84. public static double round(double v,int scale){
  85.  
  86. if(scale<0){
  87. throw new IllegalArgumentException(
  88. "The scale must be a positive integer or zero");
  89. }
  90. BigDecimal b = new BigDecimal(Double.toString(v));
  91. BigDecimal one = new BigDecimal("1");
  92. return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
  93. }
  94. }

Js:

  1. //除法函数,用来得到精确的除法结果
  2. //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
  3. //调用:accDiv(arg1,arg2)
  4. //返回值:arg1除以arg2的精确结果
  5.  
  6. function accDiv(arg1,arg2){
  7. var t1=0,t2=0,r1,r2;
  8. try{t1=arg1.toString().split(".")[1].length}catch(e){}
  9. try{t2=arg2.toString().split(".")[1].length}catch(e){}
  10. with(Math){
  11. r1=Number(arg1.toString().replace(".",""))
  12. r2=Number(arg2.toString().replace(".",""))
  13. return (r1/r2)*pow(10,t2-t1);
  14. }
  15. }
  16. //给Number类型增加一个div方法,调用起来更加方便。
  17. Number.prototype.div = function (arg){
  18. return accDiv(this, arg);
  19. }
  20.  
  21. //乘法函数,用来得到精确的乘法结果
  22. //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
  23. //调用:accMul(arg1,arg2)
  24. //返回值:arg1乘以arg2的精确结果
  25.  
  26. function accMul(arg1,arg2)
  27. {
  28. var m=0,s1=arg1.toString(),s2=arg2.toString();
  29. try{m+=s1.split(".")[1].length}catch(e){}
  30. try{m+=s2.split(".")[1].length}catch(e){}
  31. return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
  32. }
  33. //给Number类型增加一个mul方法,调用起来更加方便。
  34. Number.prototype.mul = function (arg){
  35. return accMul(arg, this);
  36. }
  37.  
  38. //加法函数,用来得到精确的加法结果
  39. //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
  40. //调用:accAdd(arg1,arg2)
  41. //返回值:arg1加上arg2的精确结果
  42.  
  43. function accAdd(arg1,arg2){
  44. var r1,r2,m;
  45. try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
  46. try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
  47. m=Math.pow(10,Math.max(r1,r2))
  48. return (arg1*m+arg2*m)/m
  49. }
  50. //给Number类型增加一个add方法,调用起来更加方便。
  51. Number.prototype.add = function (arg){
  52. return accAdd(arg,this);
  53. }
  54.  
  55. //在你要用的地方包含这些函数,然后调用它来计算就可以了。
  56. //比如你要计算:7*0.8 ,则改成 (7).mul(8)
  57. //其它运算类似,就可以得到比较精确的结果。
  58.  
  59. //减法函数
  60. function Subtr(arg1,arg2){
  61. var r1,r2,m,n;
  62. try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
  63. try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
  64. m=Math.pow(10,Math.max(r1,r2));
  65. //last modify by deeka
  66. //动态控制精度长度
  67. n=(r1>=r2)?r1:r2;
  68. return ((arg1*m-arg2*m)/m).toFixed(n);
  69. }

  

Java和Js的高精度计算的更多相关文章

  1. Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换

    Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换 { "@type":"java.lang.Runti ...

  2. Android WebView加载本地html并实现Java与JS交互

    最近做的一个项目中,用到自定义地图,将自定义地图转换成html页面,现在需要做的是如何将本地的html加载到android中,并可以实现交互. 相关讲解: 其实webview加载资源的速度并不慢,但是 ...

  3. Android与H5交互(java与js的交互)

    一.理论概述 1.js调用java方法 直接调用WebView的该方法就可以添加接口了,不过先要启动交互 // 启用javascript mWebView.getSettings().setJavaS ...

  4. android混合开发,webview的java与js互操作

    android原生应用,用webview加载应用中的网页,并且java代码与js代码可以互相操作. 这是混合开发的基石,最基本也最重要的东西,实验代码在这里. 概括说说—— java调js:调用web ...

  5. java、js的编码、解码

    如果在地址栏挂载参数,特别是包含中文,往往要进行编码,取值时再解码,以下是java和js中编码.解码的各自方法. java: @Test public void test3() throws Unsu ...

  6. android webview js交互 第一节 (java和js交互)

    转载请注明出处         挺帅的移动开发专栏  http://blog.csdn.net/wangtingshuai/article/details/8631835        在androi ...

  7. gwt中java与js的相互调用

    1. java通过jsni调用内部js Button button = new Button("java调用内部jsni的js方法"); button.addClickHandle ...

  8. JAVA转让JS功能

    今天,在发展中使用js和Java互动.通常我们使用更多的是js转让Java方法.可以使用dwr.Ajax.jquery.突然发现Java转让js然后,我真的没见过,今天,互联网提供以下信息,顺便总结: ...

  9. Android开发学习之路--Java和Js互相调用

      随着前端的火热,以前开发的快速,越来越多的native app在其中融合了h5,就拿淘宝就是很多的h5组成的,一旦出现什么节日,他都可以不用通过更新app来实现界面的改变,而且android和io ...

随机推荐

  1. Markdown常用的几种语法

    在VScode上面写的,现将代码粘贴如下:(在VScode里运行下即可) # Markdown语法 # Ctrl + k v 打开侧边预览 ## 一.加粗斜体删除线 **这是要加粗的文字** *这是要 ...

  2. POJ 2761 Feed the dogs(平衡树or划分树or主席树)

    Description Wind loves pretty dogs very much, and she has n pet dogs. So Jiajia has to feed the dogs ...

  3. 用vs调试项目页面无样式

    ASP.NET Development Server 上的文件授权 在文件系统网站中,静态文件(例如图像和样式表)遵守 ASP.NET 授权.例如,如果禁用了对静态文件的匿名访问,匿名用户则不能使用文 ...

  4. epc笔记

    http://wenku.baidu.com/view/5e921520dd36a32d7375812a.html 1.  先注册, EPC注册EPS业务或non-EPS服务 ?? HSS做什么? 2 ...

  5. Java基础——集合

    java的集合类是一个工具类,存放在java.util包中.它不仅可以存储对象,也可以实现常用数据结构,如栈.队列等.严格的说,集合类存放的是对象的引用,而不是对象本身. java集合主要由这两个接口 ...

  6. 【SSH】——Struts2中的动态方法调用(一)

    首先我们来看一个简单的调用: 1.在web.xml中配置拦截器StrutsPrepareAndExecuteFilter.StrutsPrepareAndExecuteFilter实现了filter接 ...

  7. coredump分析

    首先通过命令 gdb freeswitch core.60954进入gdb. 这里freeswitch 是产生coredump的可执行应用,core.60954是应用产生的coredump文件. 然后 ...

  8. Linux中安装apache

    一.前言 安装的背景就是公司项目要用,自己在linux安装软件不多,过程比较曲折,需要记录一下(最近几篇博客好像都会有这种高大上的背景)~先说下笔者安装环境以及相关软件版本: 操作系统:RedHat ...

  9. WebService使用介绍(一)

    Socket实现 javaSocket通信原理 第一步:服务端创建serverSocket,启动服务.监听端口 /** * 天气查询服务端 * @author SMN * @version V1.0 ...

  10. Spring之JDBC

    jdbc.properties driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/ssi?useUnicode ...