当前位置: 首页 > news >正文

java防止计算时精度丢失

在double,float类型之间做计算经常会出现精度丢失的情况,用BigDecimal类进行计算就不会出现这种精度丢失的情况了,所以封装了加减乘除的方法,方便使用。

 1 import java.math.BigDecimal;
 2 
 3 
 4 /**
 5  * 精确计算(防止精度丢失)
 6  * 
 7  * @author Administrator
 8  *
 9  */
10 public class ArithUtil {
11 
12     
13     /**
14      * 提供精确加法计算的add方法
15      * 
16      * @param value1 被加数
17      * @param value2 加数
18      * @return 两个参数的和
19      */
20     public static double add(double value1, double value2) {
21         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
22         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
23         return b1.add(b2).doubleValue();
24     }
25 
26     /**
27      * 提供精确减法运算的sub方法
28      * 
29      * @param value1 被减数
30      * @param value2 减数
31      * @return 两个参数的差
32      */
33     public static double sub(double value1, double value2) {
34         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
35         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
36         return b1.subtract(b2).doubleValue();
37     }
38 
39     /**
40      * 提供精确乘法运算的mul方法
41      * 
42      * @param value1 被乘数
43      * @param value2 乘数
44      * @return 两个参数的积
45      */
46     public static double mul(double value1, double value2) {
47         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
48         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
49         return b1.multiply(b2).doubleValue();
50     }
51 
52     /**
53      * 提供精确的除法运算方法div
54      * 
55      * @param value1 被除数
56      * @param value2  除数
57      * @param scale 精确范围
58      * @return 两个参数的商
59      * @throws IllegalAccessException
60      */
61     public static double div(double value1, double value2, int scale)
62             throws IllegalAccessException {
63         // 如果精确范围小于0,抛出异常信息
64         if (scale < 0) {
65             throw new IllegalAccessException("精确度不能小于0");
66         }
67         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
68         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
69         return b1.divide(b2, scale).doubleValue();
70     }
71     
72     /**
73      * 四舍五入保留两位小数
74      * @param f
75      * @return
76      */
77     public static double fixedNumber(double f) {
78         BigDecimal bg = new BigDecimal(f);
79         double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
80         return f1;
81     }
82     
83     
84 }

 

转载于:https://www.cnblogs.com/zh-1721342390/p/8276822.html

相关文章:

  • cesium编程入门(五)绘制形状
  • CSS背景图片垂直居中center不起效果完美解决
  • iOS----------教你如何使用 GitHub Desktop
  • python目录操作整理
  • 【转】 缓存在高并发场景下的常见问题
  • Ubuntu16.04下安装sublime text3
  • 理解MySql的锁事务隔离级别
  • 多台Mac电脑使用一个apple开发者账号
  • String 类 常用函数
  • mybatis单笔批量保存
  • git push origin master错误
  • BZOJ1415 [Noi2005]聪聪和可可 【SPFA + 期望dp记忆化搜索】
  • C. Permute Digits dfs大模拟
  • r-mq实现顺序消费,不重复消费
  • 53. Maximum Subarray(动态规划)
  • [笔记] php常见简单功能及函数
  • 03Go 类型总结
  • angular2 简述
  • ES6--对象的扩展
  • Gradle 5.0 正式版发布
  • mysql 数据库四种事务隔离级别
  • PHP 小技巧
  • SpiderData 2019年2月16日 DApp数据排行榜
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • vue总结
  • 浮现式设计
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 使用权重正则化较少模型过拟合
  • 无服务器化是企业 IT 架构的未来吗?
  • 移动端唤起键盘时取消position:fixed定位
  • 硬币翻转问题,区间操作
  • 鱼骨图 - 如何绘制?
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​一些不规范的GTID使用场景
  • # C++之functional库用法整理
  • # 计算机视觉入门
  • #stm32整理(一)flash读写
  • (C++)八皇后问题
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (二)Linux——Linux常用指令
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (七)理解angular中的module和injector,即依赖注入
  • (一)UDP基本编程步骤
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)甲方乙方——赵民谈找工作
  • ***原理与防范
  • .net 受管制代码