# 关于BigDecimal精度影响计算结果的问题

## 设置和获取Scale精度

 BigDecimal setScale(int newScale)Returns a BigDecimal whose scale is the specified value, and whose value is numerically equal to this BigDecimal's. BigDecimal setScale(int newScale, int roundingMode)Returns a BigDecimal whose scale is the specified value, and whose unscaled value is determined by multiplying or dividing this BigDecimal's unscaled value by the appropriate power of ten to maintain its overall value. BigDecimal setScale(int newScale, RoundingMode roundingMode)Returns a BigDecimal whose scale is the specified value, and whose unscaled value is determined by multiplying or dividing this BigDecimal's unscaled value by the appropriate power of ten to maintain its overall value.

 int scale()Returns the scale of this BigDecimal.

## 默认精度是多少

System.out.println(new BigDecimal(1).scale());
System.out.println(new BigDecimal(1.0).scale());
System.out.println(new BigDecimal(1.00).scale());
System.out.println(new BigDecimal(1.1).scale());
System.out.println(new BigDecimal(1.11).scale());
System.out.println(new BigDecimal(1.1111).scale());
System.out.println(new BigDecimal(11.1).scale());
System.out.println(new BigDecimal(111.1).scale());
System.out.println(new BigDecimal(1111.1).scale());
System.out.println(new BigDecimal(11111.1).scale());
System.out.println(new BigDecimal("1").scale());
System.out.println(new BigDecimal("1.0").scale());
System.out.println(new BigDecimal("1.00").scale());
System.out.println(new BigDecimal("1.1").scale());
System.out.println(new BigDecimal("1.11").scale());
System.out.println(new BigDecimal(999999999999999.1).scale());
System.out.println(new BigDecimal(999999999999999.1));
System.out.println(new BigDecimal("9999999999999999999999999999999999999999.000000").scale());
System.out.println(new BigDecimal("9999999999999999999999999999999999999999.000000"));
System.out.println(new BigDecimal("9999999999999999999999999999999999999999.000000").divide(new BigDecimal("9"),RoundingMode.HALF_DOWN)));

System.out.println(new BigDecimal(1).scale()); // 0
System.out.println(new BigDecimal(1.0).scale()); // 0
System.out.println(new BigDecimal(1.00).scale()); // 0
System.out.println(new BigDecimal(1.1).scale()); // 51
System.out.println(new BigDecimal(1.11).scale()); // 52
System.out.println(new BigDecimal(1.1111).scale()); // 51
System.out.println(new BigDecimal(11.1).scale()); // 49
System.out.println(new BigDecimal(111.1).scale()); // 45
System.out.println(new BigDecimal(1111.1).scale()); // 41
System.out.println(new BigDecimal(11111.1).scale()); // 39
System.out.println(new BigDecimal("1").scale()); // 0
System.out.println(new BigDecimal("1.0").scale()); // 1
System.out.println(new BigDecimal("1.00").scale()); // 2
System.out.println(new BigDecimal("1.1").scale()); // 1
System.out.println(new BigDecimal("1.11").scale()); // 2
System.out.println(new BigDecimal(999999999999999.1).scale()); // 3
System.out.println(new BigDecimal(999999999999999.1)); // 999999999999999.125
System.out.println(new BigDecimal("9999999999999999999999999999999999999999.000000").scale()); // 6
System.out.println(new BigDecimal("9999999999999999999999999999999999999999.000000")); // 9999999999999999999999999999999999999999.000000
System.out.println(new BigDecimal("9999999999999999999999999999999999999999.000000").divide(new BigDecimal("9"),RoundingMode.HALF_DOWN))); // 1111111111111111111111111111111111111111.000000

1) 对于整型，精度就是0
2) 对于double型
小数点后面是0的话，精度就是0；
小数点后面不是0，则取决于整数位的位数，整数位越多，精度越小；当整数位接近15位时，精度就趋于0，再多1位数据可能开始溢出（具体情况取决于double类型的数值表示）。
3) 对于字符串类型的构造函数，小数点后面有几位，精度就是几位，而且几乎没有位数限制（试了40位都没有问题）

## 总结

System.out.println(new BigDecimal("1.000000").scale());

BigDecimal orderAmount = new BigDecimal(0);
orderAmount = orderAmount.setScale(6, RoundingMode.HALF_EVEN);

BigDecimal orderMonthAmount; // 省略orderMonthAmount的初始化
BigDecimal orderValue = orderMonthAmount.divide(new BigDecimal(30), RoundingMode.HALF_EVEN)
.multiply(new BigDecimal(interval))
.setScale(2, BigDecimal.ROUND_HALF_EVEN);

## 参考

BigDecimal API

Java.math.BigDecimal.scale()方法实例

Java BigDecimal详解

• 本文已收录于以下专栏：

## Android BigDecimal对金额进行精确计算

• a_kevin
• 2017年07月18日 16:53
• 1143

## BigDecimal类的加减乘除(解决double计算精度问题)

BigDecimal简介 Java在java.math包中提供的API类BigDecimal，用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中...
• qq_28270161
• 2015年07月09日 16:31
• 2035

## Java中BigDecimal精度丢失

doule不能表示为任何有限长度的二进制小数。 1.前言 　　Java在java.math包中提供的API类BigDecimal，用来对超过16位有效位的数进行精确的运算。 　　双精度浮点型变量...
• xiaozhushowtime
• 2017年05月22日 21:15
• 1738

## java.math.BigDecimal的精度问题

1. String myMoney = "100.0128";  BigDecimal money= new BigDecimal(myMoney);  //设置精度，以及舍入规则  money= m...
• suliqiang
• 2006年05月08日 17:40
• 13012

## BigDecimal 保住数据精度

• qishuo_java
• 2014年09月01日 22:33
• 3195

## 关于BigDecimal的使用

• u011526599
• 2016年10月26日 00:09
• 1139

## BigDecimal 的那些坑事儿

• ugg
• 2012年11月22日 18:40
• 39724

## BigDecimal加减乘除运算

java.math.BigDecimal。BigDecimal一共有4个够造方法，让我先来看看其中的两种用法： 第一种：BigDecimal(double val) Translates a do...
• huiwenjie168
• 2011年11月21日 21:22
• 257656

## java BigDecimal 高精度运算 小数点处理详解

• catkint
• 2016年03月06日 21:19
• 736

## BigDecimal准确设置小数点后的精度

• a363722188
• 2015年06月25日 10:18
• 7176

举报原因： 您举报文章：关于BigDecimal精度影响计算结果的问题 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)