精度计算的方法

java.math.BigDecimal。BigDecimal一共有4个够造方法,让我先来看看其中的两种用法:

第一种:BigDecimal(double val)
Translates a double into a BigDecimal.

第二种:BigDecimal(String val)
Translates the String repre sentation of a BigDecimal into a BigDecimal.

使用BigDecimal要用String来够造,要做一个加法运算,需要先将两个浮点数转为String,然后够造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。

public static double add(double v1,double v2)
public static double sub(double v1,double v2)
public static double mul(double v1,double v2)
public static double div(double v1,double v2)
public static double div(double v1,double v2,int scale)
public static double round(double v,int scale)

Java代码  

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

精度计算的方法的相关文章

javascript避免数字计算精度误差的方法详解

本篇文章主要是对javascript避免数字计算精度误差的方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 如果我问你 0.1 + 0.2 等于几?你可能会送我一个白眼,0.1 + 0.2 = 0.3 啊,那还用问吗?连幼儿园的小朋友都会回答这么小儿科的问题了.但是你知道吗,同样的问题放在编程语言中,或许就不是想象中那么简单的事儿了.不信?我们先来看一段 JS. var numA = 0.1; var numB = 0.2; alert( (numA + numB) === 0.3

多精度计算备忘录之乘法 ------ 复杂度分析

多精度计算里,多精度乘法是其中最重要的运算之一,编写的多精度库(类)的其中一个重要效率标识就是其乘法的速度. 根据曾经写的大数类的记忆,简单记录下其中的一些技巧,以备查询. 一般的算法有如: 多精度乘法,所知的几个主要的优化方法有: 1:直接乘法. 2:comba乘法 3:Karatsuba乘法 4:toom_cook乘法 5:FFT乘法 6:FNT算法,或其他类似的有限域上对应类似的FFT算法 7:自己未曾理解的算法. 8:改进技巧, 1:直接乘法. a   b    c *         

php的精度计算问题(bcadd和bcsub)

一.前言 我们在进行php开发的时候经常会遇到浮点型的问题,特别是涉及金额的部分,常常需要进行加减运算.当小数点的位数比较多的时候,往往容易犯一些很低级的错误.这里记录一下php的精度计算和封装的小demo. 二.关于php的高精度问题 1.概念解释 这篇文章的解释最清楚: php高精度计算问题 2.高精度数值对比大小问题 下面这篇文章讲的很好: 临时发一个项目遇到的PHP浮点计算问题 默认保留两位小数 bcadd(参数1,参数2,参数3) 参数1 和2 是要相加的参数 3是保留几位小数. 1.

HighChats图表控件显示精度小数点的方法

相信大家对highchats这个图表控件并不陌生,最近在项目中用到它,但是某些字段需要显示为小数点,顾查找资料文档发现下面两个方式可以实现: 初始化时候添加如下两个参数 tooltip:{??? formatter:function(){??? return''+this.point.name+': '+Math.round(this.percentage)+' %';??? }},plotOptions:{?????? pie:{?????? allowPointSelect:true,???

精度计算-大数阶乘

精度计算-大数阶乘 本算法的目的在于计算一个比较大的数的阶乘,由于得到的结果比较大,是现有的数据类型无法存储的,所以我决定将结果存储在一个long a[]数组中. 我们的思路是把每4位数看做数组的一个元素来存储,例如:个.十.百.千存在a[0],万.十万.百万.千万存在a[1]以此类推. 我们用10的阶乘来模拟一下求结果大于4位数阶乘的过程,9的阶乘为362880,而10的阶乘为9的阶乘乘以10,在计算完9的阶乘时a[0] = 2880,a[1]=36,因为362880*10 = (36*10+

字符串相似度计算的方法,使用SQL以及C#实现,本文非原创摘自网络(.NET SQL技术交流群入群206656202需注明博客园)

1 CREATE function get_semblance_By_2words 2 ( 3 @word1 varchar(50), 4 @word2 varchar(50) 5 ) 6 returns nvarchar(4000) 7 as 8 begin 9 declare @re int 10 declare @maxLenth int 11 declare @i int,@l int 12 declare @tb1 table(child varchar(50)) 13 declare

6_资金收支计算的方法

资金收支计算书的目的  当年度的所有活动对应的所有收入和支出的内容明细. 当年度支付资金的详细. 1,2的矛盾:.所以需要有调整的存在.  1会含有实际上没有支付资金变化的交易(未付/未收金). 2会含有非本年度活动但是今年发生的支付资金变化的交易. 支付资金:现金,随时都能使用的预金. 资产的支出和消费的支出的区别 是记录在固定资产勘定(设备相关支出)上,消耗品费或维修费的经费勘定(消费的支出)上.6_资金收支计算的方法

精度计算-大数乘大数

精度计算                     大数乘大数 本算法是用来计算一个大数(现有的数据类型无法表示的数)乘以一个大数(现有的数据类型无法表示的数). 算法思路是把大数的每一位都当做一个字符放入一个字符数组中,再把乘数的各个位与被乘数的各个位从最高位依次相乘,将结果存放在一个二维数组res中.例如计算12*12,res[0][0] = 1,res[0][1] = 2,res[1][0] = 2,res[1][1] = 4,那么最终结果的数组s,s[0] = res[0][0]= 1,s

精度计算-大数加大数

精度计算                大数加大数 本算法是用来计算一个大数(现有的数据类型无法表示的数)加上一个大数(现有的数据类型无法表示的数). 算法思路是把作为被加数和加数的大数的每一位都当做一个字符分别放入一个字符数组中,再把加数的各个位与被加数的各个位从最低位依次相加,将结果存放在一个字符指针中,最后再放入一个结果数组中. 下面是我的C语言实现过程 #include<stdio.h> #include<string.h> void add(char a[],char b