`
songsong_b
  • 浏览: 69726 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

JAVA中高精度Double运算

阅读更多
源文件Arith.java:
package com.common.util;
import java.math.BigDecimal;
/**
* 由于Java的简单类型不能够精确的对浮点数进行运算,
* 这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入。
*/
public final class Arith {
// 默认除法运算精度
private static final int DEF_DIV_SCALE = 2;
// 这个类不能实例化
private Arith() {
}
/**
  * 提供精确的加法运算。
  *
  * @param v1 被加数
  * @param v2 加数
  * @return 两个参数的和
  */
public static double add(double v1, double v2) {
  BigDecimal b1 = new BigDecimal(Double.toString(v1));
  BigDecimal b2 = new BigDecimal(Double.toString(v2));
  return b1.add(b2).doubleValue();
}
/**
  * 提供精确的减法运算。
  *
  * @param v1 被减数
  * @param v2 减数
  * @return 两个参数的差
  */
public static double sub(double v1, double v2) {
  BigDecimal b1 = new BigDecimal(Double.toString(v1));
  BigDecimal b2 = new BigDecimal(Double.toString(v2));
  return b1.subtract(b2).doubleValue();
}
/**
  * 提供精确的乘法运算。
  *
  * @param v1 被乘数
  * @param v2 乘数
  * @return 两个参数的积
  */
public static double mul(double v1, double v2) {
  BigDecimal b1 = new BigDecimal(Double.toString(v1));
  BigDecimal b2 = new BigDecimal(Double.toString(v2));
  return b1.multiply(b2).doubleValue();
}
/**
  * 提供(相对)精确的除法运算,当发生除不尽的情况时,
  * 精确到小数点以后10位,以后的数字四舍五入。
  *
  * @param v1 被除数
  * @param v2 除数
  * @return 两个参数的商
  */
public static double div(double v1, double v2) {
  return div(v1, v2, DEF_DIV_SCALE);
}
/**
  * 提供(相对)精确的除法运算。
  * 当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。
  *
  * @param v1 被除数
  * @param v2 除数
  * @param scale 表示表示需要精确到小数点以后几位。
  * @return 两个参数的商
  */
public static double div(double v1, double v2, int scale) {
  if (scale < 0) {
   throw new IllegalArgumentException(
   "The scale must be a positive integer or zero");
  }
  BigDecimal b1 = new BigDecimal(Double.toString(v1));
  BigDecimal b2 = new BigDecimal(Double.toString(v2));
  return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
  * 提供精确的小数位四舍五入处理。
  *
  * @param v 需要四舍五入的数字
  * @param scale 小数点后保留几位
  * @return 四舍五入后的结果
  */
public static double round(double v, int scale) {
  if (scale < 0) {
   throw new IllegalArgumentException(
   "The scale must be a positive integer or zero");
  }
  BigDecimal b = new BigDecimal(Double.toString(v));
  BigDecimal one = new BigDecimal("1");
  return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
分享到:
评论

相关推荐

    Java 加减乘除工具类(解决精度损失问题)

    为啥分这么高呢。因为宝宝想分想疯了。 附代码,有土豪就打赏打赏,没土豪的直接拿去使吧。 package cn.cisdom.base.utils; import java.math.BigDecimal; import java.text.DecimalFormat; public class ...

    java工具类.zip

    总结了好久 1.利用public static method进行日期格式的转换 2.利用内容的Calendar object进行日期的计算,适合有大量的日期计算...4提供高精度的运算支持. 所以函数以double为参数类型,兼容int与float. 5字符串工具类

    整理后java开发全套达内学习笔记(含练习)

    进行高精度运算可以用java.math包中BigDecimal类中的方法。 自动类型提升又称作隐式类型转换。 强制类型转换:int ti; (byte) ti ; 强制转换,丢弃高位 宣告变量名称的同时,加上“final”关键词来限定,这个...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例210 高精度浮点运算 265 实例211 七星彩号码生成器 266 实例212 大乐透号码生成器 267 实例213 监视JVM内存状态 268 实例214 启动默认文本工具 269 实例215 简单的截图软件 270 第10章 Commons组件 272 10.1 ...

    2.Java基础语法.ppt

    类型的优先级别:byte,short,char,int,long,float,double (低–高) 右&gt;左–强制类型转换 右&lt;左–自动转换 右=左–不用转 三、运算符: 算术运算符: +,-,*,/,%,++,– 赋值运算符:= 关系运算符: &gt;,&lt;,&gt;...

    仿WINDOWS简版计算器

    Java SE学习完成后,自己练手项目二,计算器 ... * @return BigDecimal 包装为高精度计算 */ private static BigDecimal getBigDecimal(double number) { return new BigDecimal(number); }

    java经典面试2010集锦100题(不看你后悔)

    C) 双精度类型double比单精度类型float具有更高的精度和更大的表示范围,但float类型具有速度快、占用内存小的优点。 D) 在Java中布尔值可以用true或false来表示,但是同时也可以用1或0来表示。 题目5:b 程序...

    ACM/ICPC模板

    --高精度模板 --RMQ --改点堆优化的dijkstra算法 --快速付利叶变换 --稳定婚姻问题 --SPFA(最短路快速算法) // thanks to love8909 几何相关 --初等几何学 --多边形几何 --几种凸包算法 --半平面交算法 --旋转卡壳...

    详谈javascript精度问题与调整

    在JS中数值类型就只有number类型,没有int,float,double之分,number类型实际上存储的就是IEEE754标准的浮点数,计算规则也是。 在表达式计算前,先要按照标准将两个数转成浮点数。 IEEE 754规定: 1.32位的浮点数...

    处理较大数字的PHP库.zip

    一般的float型和Double型数据只可以用来做科学计算或者 是工程计算,由于在商业计算中,要求的数字精度比较高,所以要用到java.math.BigDecimal类,它支持任何精度的定点数,可以用它来精确 计算货币值。

    使用JavaFX实现的中缀转后缀 计算器(可以负数小数点括号)期末作业满分答案,大量注释(行行注释保证看懂)

    利用BigDecimal 大数据类 来保证精度 例如Double 2-1.1=0.89999,在大数据类就无异常 例如 9+(-9)=0 9--6=15 9*(-9--3)= -54 3 + (-2) -1 = 0 -9*(9--2)*-3 = 297 实现了键位绑定 本计算器回退功能是直接...

    〖程序设计基础〗练习题3及答案

    20.设 i,j 为类 x 中定义的 double 型变量名,下列 x 类的构造函数中不正确的是( )。 A) double x(double k ){ i=k; return i; } B) x(double m, double n ){ i=m; j=n; } C) x( ){i=0;j=0 } D) x(double k ){ i=k;...

    matlab求导代码-Cojac:用于Java的数字嗅探工具和扩展数字包装器

    高精度数字:您选择的显著位数的标准浮动/ double类型的号码! 多么强大的运行时标志! 间隔计算,以将舍入误差控制在可控范围内,并在其增长过多时发出信号。 同样,无需任何源代码修改! 自动微分,带给您(免费!...

    一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

    第10次反弹多高? 提示:注意设置精度,不然会和预期的结果有偏差。 程序一:默认小球弹跳10次 import java.util.Scanner; public class Prog10 { public static void main(String[] args) { double high; ...

    mandelbrot:简单的Mandelbrot查看器

    可以交互式缩放到10 -100甚至更大,如果需要更高的精度,所有计算将自动从double切换到BigDecimal。 渲染是渐进式的且经过优化的,因此尽管缩放级别为100的图像的完整渲染可能会超过1个小时,但应用程序仍会保持...

    大智慧股票本地数据读取接口(含源码)

    3)程序将自动补充数据,即如果目标表不存在,则建立并添加数据,如果目标表已存在,则判断表中每只证券的最新 数据,然后只添加数据表中所缺少的数据. ****************************************************************...

    freemarker总结

    这是一个典型的分支控制指令,该指令的作用完全类似于Java语言中的if,if指令的语法格式如下: &lt;#if condition&gt;... &lt;#elseif condition&gt;... &lt;#elseif condition&gt;... &lt;#else&gt; ... 例子如下: (age&gt;60)&gt;老年人 ...

Global site tag (gtag.js) - Google Analytics