浮点型丢失精度解决办法
2015-11-05 14:41
399 查看
1、浮点型Float Double 在计算过程中 精度会在一定程度上丢失 为了解决精度丢失的问题 JDK 给我们提供解决方案 利用String、BigDecimal作为中介
丢失原因:计算机只能识别二进制,浮点数参与运算,首先会转换为二进制,再参与运算;在转换的过程中发生了数据丢失(至于具体原因这里不做详细阐述);
2、两个数相加Add
3、两个数减法Sub:
4、两个数除法Div:
5、有人将上述方法封装为Arith类,引入包,可以直接静态调用。
丢失原因:计算机只能识别二进制,浮点数参与运算,首先会转换为二进制,再参与运算;在转换的过程中发生了数据丢失(至于具体原因这里不做详细阐述);
2、两个数相加Add
public static double add(double d1, double d2) { BigDecimal b1 = new BigDecimal(Double.toString(d1)); BigDecimal b2 = new BigDecimal(Double.toString(d2)); return b1.add(b2).doubleValue(); }
3、两个数减法Sub:
public static double sub(double d1, double d2) { BigDecimal b1 = new BigDecimal(Double.toString(d1)); BigDecimal b2 = new BigDecimal(Double.toString(d2)); return b1.subtract(b2).doubleValue(); }
4、两个数除法Div:
/** * * @param d1 被除数 * @param d2 除数 * @param scale 保留小数位数 * @return */ public static double div(double d1, double d2, int scale) { if (scale < 0) { throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(d1)); BigDecimal b2 = new BigDecimal(Double.toString(d2)); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); }
5、有人将上述方法封装为Arith类,引入包,可以直接静态调用。
相关文章推荐
- static_cast和reinterpret_cast
- ImageLoader进阶(结合ListView、ViewPager使用)
- 使用Log4j记录日志说明
- Logback学习笔记
- Xshell配色方案说明
- java socket编程中backlog的含义
- 初学Mybaties连接oracle/Mysql数据库 基于eclipse/myeclipse的开发环境
- vs2013 快捷键整理
- 使用Qt开发中国象棋(六):将军和死棋检测
- 数组排序系列 sortedArrayUsingComparator
- Android学习路线
- Tutorial: Loading Wave files in OpenAL without ALUT
- Apache Kafka源码分析 - ReplicaStateMachine
- HDU 5510 Bazinga
- ARC下OC对象和CF对象之间的桥接(bridge)
- javascript设计模式实践之代理模式--图片预加载
- 简易入手SUI
- 第十天
- POJ 3273 Monthly Expense
- Java 基础语法