double的计算不精确,会有类似0.0000000000000002的误差,正确的方法是使用BigDecimal或者用整型

Double 工具类

package org.fh.util;

import java.io.Serializable;

import java.math.BigDecimal;

import java.math.RoundingMode;

/**

* double的计算不精确,会有类似0.0000000000000002的误差,正确的方法是使用BigDecimal或者用整型

* 整型地方法适合于货币精度已知的情况,比如12.11+1.10转成1211+110计算,最后再/100即可 以下是摘抄的BigDecimal方法:

*/

/**

* 说明:Double工具类

* from:www.1b23.com

*/

public class DoubleUtil implements Serializable {

private static final long serialVersionUID = -3345205828566485102L;

// 默认除法运算精度

private static final Integer DEF_DIV_SCALE = 2;

/**

* 提供精确的加法运算。

*

* @param value1 被加数

* @param value2 加数

* @return 两个参数的和

*/

public static Double add(Double value1, Double value2) {

BigDecimal b1 = new BigDecimal(Double.toString(value1));

BigDecimal b2 = new BigDecimal(Double.toString(value2));

return b1.add(b2).doubleValue();

}

/**

* 提供精确的减法运算。

*

* @param value1 被减数

* @param value2 减数

* @return 两个参数的差

*/

public static double sub(Double value1, Double value2) {

BigDecimal b1 = new BigDecimal(Double.toString(value1));

BigDecimal b2 = new BigDecimal(Double.toString(value2));

return b1.subtract(b2).doubleValue();

}

/**

* 提供精确的乘法运算。

*

* @param value1 被乘数

* @param value2 乘数

* @return 两个参数的积

*/

public static Double mul(Double value1, Double value2) {

BigDecimal b1 = new BigDecimal(Double.toString(value1));

BigDecimal b2 = new BigDecimal(Double.toString(value2));

return b1.multiply(b2).doubleValue();

}

/**

* 提供(相对)精确的除法运算,当发生除不尽的情况时, 精确到小数点以后10位,以后的数字四舍五入。

*

* @param dividend 被除数

* @param divisor 除数

* @return 两个参数的商

*/

public static Double divide(Double dividend, Double divisor) {

return divide(dividend, divisor, DEF_DIV_SCALE);

}

/**

* 提供(相对)精确的除法运算。 当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。

*

* @param dividend 被除数

* @param divisor 除数

* @param scale 表示表示需要精确到小数点以后几位。

* @return 两个参数的商

*/

public static Double divide(Double dividend, Double divisor, Integer scale) {

if (scale < 0) {

throw new IllegalArgumentException("The scale must be a positive integer or zero");

}

BigDecimal b1 = new BigDecimal(Double.toString(dividend));

BigDecimal b2 = new BigDecimal(Double.toString(divisor));

return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();

}

/**

* 提供指定数值的(精确)小数位四舍五入处理。

*

* @param value 需要四舍五入的数字

* @param scale 小数点后保留几位

* @return 四舍五入后的结果

*/

public static double round(double value, int scale) {

if (scale < 0) {

throw new IllegalArgumentException("The scale must be a positive integer or zero");

}

BigDecimal b = new BigDecimal(Double.toString(value));

BigDecimal one = new BigDecimal("1");

return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue();

}

}

java double 乘_java Double 进行加减乘除相关推荐

  1. java double用法_Java Double doubleToLongBits()用法及代码示例

    Java Double类的java.lang.Double.doubleToLongBits()方法是Java中的内置函数,该函数根据IEEE 754浮点"double format&quo ...

  2. java double方法_Java Double类compare()方法与示例

    java double方法 双类compare()方法 (Double class compare() method) compare() method is available in java.la ...

  3. java double空值_Java Double NullPointerException

    问题描述 重构计量项目后台,运行单元测试时,遇到了错误. 第145行: 又没有在null上调方法,两个Double相乘,怎么会空指针呢? 尝试 打开IDEA新建一个普通的Java项目. double ...

  4. java double 后缀_Java double数据类型

    double数据类型使用64位来存储浮点数.double值也称为双精度浮点数. 它可以表示一个最小为4.9 x 10^-324,最大为1.7 x 10^308的数字.它可以是正的或负的. 所有实数被称 ...

  5. java double 常量_Java Double类,Double类的常用常量介绍

    下面的文章内容主要会给大家介绍Double类的常用常量方面的知识,那么你知道Double类的常用常量都有哪些吗?一起通过文章内容来进行了解吧. 在Double类当中,包含了很多的常量,在这些常量当中, ...

  6. java divide 用法_java中BigDecimal加减乘除基本用法

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数. 在实际应用中,需要对更大或者更小的数进 ...

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

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

  8. java math 类_Java Math类静态长轮(double d)示例

    java math 类 数学课静态长回合(双D) (Math Class static long round(double d) ) This method is available in java. ...

  9. java math 类_Java Math类静态双层(double d)示例

    java math 类 数学班静态双层(双D) (Math Class static double floor(double d)) This method is available in java. ...

最新文章

  1. R语言ggplot2可视化增加坐标轴的刻度数实战:自定义坐标轴刻度粒度、增加坐标轴刻度的粒度、更加精细地表达
  2. Java 微信公众号导出所有粉丝(openId)
  3. Ubuntu中zabbix 4.2.6监控postgresql数据库
  4. eclipse修改xml文件默认的打开方式为XML Editor
  5. vs生成解决方案默认路径_交换网络防环协议——STP生成树,太阁实验栈
  6. GAN造图MINST手写数字
  7. 地震设计反应谱、时程分析法和地震动选取与调整
  8. 密码学术语中英文对照(持续更新中)
  9. C#基于FFmpeg实现录屏功能
  10. 你也认为技术总监应懂技术细节,那就有些可悲了
  11. 如何用 React 完成图片上传功能
  12. 在上海创业的日子之了解银行企业对公基础账户收费情况
  13. 面试大厂,你需要掌握这些面试技巧
  14. iOS App “去评分” 功能的几种实现总结
  15. 2019软件测试学习教程(学习路线+课程大纲+视频教程+学习工具)
  16. 音视频开发之旅(36) -FFmpeg +OpenSL ES实现音频解码和播放
  17. oracle 自动异地备份,实现Oracle异地数据自动备份方案 | 学步园
  18. 1-13 格式化输出
  19. 区块链创新之路,该何去何从?
  20. 程序员持续记录开始赚钱之旅 (第一篇)

热门文章

  1. 【算法】约瑟夫环原理及其公式
  2. QT QTextEdit 失去焦点之后取消选中态
  3. 关于vs2022 C6031 “scanf返回值被忽略”的解决办法
  4. split()函数介绍
  5. H3C ER3100路由器由于FAST路由器的ARP欺骗导致的断网的处理方法
  6. Jupyter notebook 不自动弹出网页
  7. 定时弹出网页怎么设置?
  8. Axure RP9 赶鸭子上架级入门指南
  9. The request was rejected because the URL contained a potentially malicious String ;报错解决
  10. Edge浏览器插件WeTab免费体验ChatGPT