* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入
import java.math.BigDecimal;

/** 计算工具类
*/
public class 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();}/** 除* 提供(相对)精确的除法运算。当发生除不尽的情况时,由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();}
};

转载于:https://www.cnblogs.com/unknows/p/7446558.html

Java 避免精度丢失之BigDecimal 运算相关推荐

  1. Java float精度丢失问题的解决

    之前在进行蓝桥杯赛题训练的时候,有一题涉及到实数,提交以后有一个案例通过不了,检查一看发现是数据精度丢失了,导致最终的结果出错,现记录如下. 首先,让我们来测试一下 测试代码: import java ...

  2. pgsql中float4导致java程序精度丢失_Java基础系列02

    注释 Java中支持三种注释:1.单行注释以//开始换行结束.2.多行注释以/*开始,以*/结束.3.说明注释以/**开始,以*/结束. 关键字 关键字:是指在程序中,Java已经定义好的单词,具有特 ...

  3. java 小数精度问题

    1.原因 由于浮点数在转化为二进制时无法运算完结,所以会无限循环下去,导致运算结果达不到期望值. 例如:1.14,转化为二进制,然后再转回十进制就变成了:1.139999999999999902300 ...

  4. Double计算精度丢失(金融入门知识点)

    Double计算精度丢失(金融入门知识点) 一.double精度丢失 二.为什么double会精度丢失 三.BigDecimal错误的用法 四.BigDecimal正确的用法 Double计算精度丢失 ...

  5. Java中BigDecimal解决精度丢失问题

    1.我们先看一个例子 可以看到在Java中进行浮点数运算的时候,会出现丢失精度的问题.那么我们如果在进行商品价格计算的时候,就会出现问题.很有可能造成我们手中有0.06元,却无法购买一个0.05元和一 ...

  6. 关于Java浮点数运算精度丢失问题

    2019独角兽企业重金招聘Python工程师标准>>> 关于Java浮点数运算精度丢失问题 博客分类: java 前几天看了一个朋友的博客,说Java中浮点数运算精度丢失的问题,他给 ...

  7. java数值运算后精度丢失问题

    最近连续俩次遇到运算后数值精度丢失问题,所以记录一下. 问题1:java计算百分比,应该得到57,可返回的就是56 在java代码中 BigDecimal progress;BigDecimal a ...

  8. java中double类型精度丢失问题及解决方法

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源: https://blog.csdn.net/yacolsp ...

  9. bigdicmal除法精度设置_Java BigDecimal浮点数运算--如何保证运算精度不溢出

    加减乘除四则运算是高级程序设计语言(不论机器语言.汇编还是其他高级语言)最基础的部分,Java作为最流行的软件开发语言之一,涉及四则运算的程序代码和功能业务随处可见.在笔者从事的基于Java语言银行. ...

最新文章

  1. 2017年vb计算机考试,2017年计算机二级VB考试习题及答案
  2. javase 超市库存系统
  3. JPA 2 | 动态查询与命名查询
  4. [转]Eclipse Java注释模板设置详解
  5. day52 Django全流程
  6. 牛客15555 1 + 2 = 3?
  7. 8除以2表示什么意思_八字中劫财,比肩分别表示什么意思
  8. java stringbuffer原理_深入理解Java:String
  9. 注意:ORACLE 11G ADG RAC 这个情况下并不能高可用
  10. 二叉树的创建与遍历(C++)
  11. OSSIM5 自定义安装
  12. HAProxy+Hive构建高可用数据挖掘集群
  13. 关于elastic-job 分片与线程问题
  14. 【零基础】量子纠缠图像问世,简单解读实验原理
  15. 剑指offer整理(附python代码)——递归
  16. python实现简易聊天室程序
  17. 升级Win11后Office无法验证此产品的许可证怎么办?
  18. Edge Case UVA - 1646
  19. 【PS】61款中国风古典背景水墨山水古风韵味PSD分层设计素材
  20. SpringBoot成长笔记(一)环境搭建

热门文章

  1. linux postgres用户,关于linux:在启动时创建postgres用户
  2. java格式化星期_在Java中使用SimpleDateFormat格式化星期几
  3. C++写的一个简单的词法分析器(分析C语言)
  4. ViewTreeObserver
  5. 富数据控件 GridView(定义列、格式化、样式)
  6. golang中的执行规则
  7. windows下进程间通信的(13种方法)
  8. UART, SPI, IIC的详解及三者的区别和联系
  9. 下列代码之后的结果为()?
  10. linux网络编程二:基础socket, bind, listen, accept, connect