java.math.BigDecimal,关于金额的精确计算
来源:互联网 发布:蜂窝移动数据不能关闭 编辑:程序博客网 时间:2024/05/22 22:46
今天无意中看以前的东东,发现两个double类型的数直接相加时,得到的结果不对
import java.math.BigDecimal;
public class TestDouble {
public static void main(String[] args) {
double d1 = 0.01;
double d2 = 0.05;
String s1 = "8.0";
String s2 = "3.0";
System.out.println(d1+d2);//结果为0.060000000000000005,其中缘由还不明白,请大侠们多多指教
//需要转换成BigDecimal 类型可以得到正确结果
BigDecimal bd1 = new BigDecimal(d1+"");
BigDecimal bd2 = new BigDecimal(d2+"");
System.out.println(
bd1.add(bd2).doubleValue());//BigDecimal 类型加
System.out.println(bd1.subtract(bd2).doubleValue());//BigDecimal 类型减
BigDecimal bd3 = new BigDecimal(s1);
BigDecimal bd4 = new BigDecimal(s2);
System.out.println(
bd3.multiply(bd4).doubleValue());//BigDecimal 类型乘
System.out.println(
bd3.divide(bd4,6,BigDecimal.ROUND_HALF_UP).doubleValue());//BigDecimal 类型除//
//ROUND_HALF_UP: 遇到.5的情况时往上进,例: 1.5 ->;2
//ROUND_HALF_DOWN : 遇到.5的情况时往下进,例: 1.5 ->;1
}
}
--------------------------------------------------------------
BigDecimal类还有一些其他的参数,是在网上收索到的,如下:
其他参数说明
ROUND_CEILING
如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作。
ROUND_DOWN
从不在舍弃(即截断)的小数之前增加数字。
ROUND_FLOOR
如果 BigDecimal 为正,则作 ROUND_UP ;如果为负,则作 ROUND_DOWN 。
ROUND_HALF_DOWN
若舍弃部分> .5,则作 ROUND_UP;否则,作 ROUND_DOWN 。
ROUND_HALF_EVEN
如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP ;如果它为偶数,则作 ROUND_HALF_DOWN 。
ROUND_HALF_UP
若舍弃部分>=.5,则作 ROUND_UP ;否则,作 ROUND_DOWN 。
ROUND_UNNECESSARY
该“伪舍入模式”实际是指明所要求的操作必须是精确的,,因此不需要舍入操作。
ROUND_UP
总是在非 0 舍弃小数(即截断)之前增加数字。
---------------------------------------------------------------------
注: 也是在网上看到的有人说
BigDecimal只有构造函数为String时才能真正做到精确计算,这方面用BigDecimal.valueOf是不行的,
有人建议把需要精确的数变成一个bigInteger,没有测试,据说不能完全解决精度问题。
-----------------------------------------------------------------------------
BigDecimal性能的问题
http://users.belgacombusiness.net/arci/
看看这个,另一个BigDecimal实现,据称比java.math.BigDecimal快
- java.math.BigDecimal,关于金额的精确计算
- 学习笔记之java.math.bigdecimal类的精确计算
- Android BigDecimal对金额进行精确计算
- BigDecimal的精确计算
- 关于java.math.bigdecimal
- Java精确计算:BigDecimal类
- 计算金额 财务计算 精确运算 BigDecimal用法详解
- 精确的浮点计算-BigDecimal
- 精确的数值计算BigDecimal
- Java中精确计算的一个类用BigDecimal
- Java 浮点数精确计算 BigDecimal的用法
- Java 浮点数精确计算 BigDecimal的用法
- BigDecimal实现Java浮点数的精确计算
- Java使用BigDecimal精确计算的简单公式计算器
- Java使用BigDecimal解决精确计算的问题
- JAVA中遇到金额精确计算时候的问题解决
- java计算金额大数据用BigDecimal
- Java中的BigDecimal类进行精确计算
- JSTL EL字符串处理
- 关于C++中接口的问题(转自百度)
- 几个常用的JavaScript字符串处理函数 – split()、join()、substring()和indexOf()
- LPC2378使用体会
- solr 配置clustering
- java.math.BigDecimal,关于金额的精确计算
- XMLHttpRequest
- PowerDesigner12.5 下载、汉化及破解
- msyql 索引学习
- ACE5.5 debian 下编译
- 电子商务类站点终极资源大全
- 电子商务类站点终极资源大全
- 位段【C语言】
- shell编程基础-总结