首先祝大家愚人节快乐,今天是20170401!!!
代码写的还不完善,目前只支持进位大于0的(如,乘以10,100...),其实现思路基本是一样的,需要的可以再自己开发!!!
实现功能:防止double类型计算后失真问题和E的问题.
在我反复试验的情况下了解到:
double dd = 0.000672384323;像这样的只要整数位没有数字并且小数点后面如果多于或者等3个0的时候double就会默认转换成E来表示
double dd = 0.00992384323;像这样他还是会表所有的数字展示出来,并且想保留几位就是几位,
所以在小数非常小的时候我们强制保留小数之后不能再用double来保存,要用string类型保存才行.
类似double d =0.7;当d*100时我们想得到的是70,但实际得到的往往会是70.000000001,这就是我们本程序解决的精度失真.
写的如有不好之处,期待大神的批评指导,不胜感激!!!
package com.esoft.cgt.test;
import java.text.DecimalFormat;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:application-context.xml")
public class CgtTest {
public static void main(String[] args) {
//测试
Double data = 0.112;
String rate = getDataString(data, 2);
System.out.println(rate); //输出为11.2
}
/**
* double数据进位方法
*
* @param data
* double数据
* @param b
* 进位数大于0
* @return
*/
private static String getDataString(Double data, int b) {
if (data == 0.0)
return "0";
//将数据转换成String类型,防止E出现
DecimalFormat df = new DecimalFormat("#.#########"); //保留九位小数
String dataFormat = df.format(data);
StringBuffer sb = new StringBuffer();
String[] dataSplit = dataFormat.split("\\."); //根据"."切割字符串
if (dataSplit[0].equals("0")) {
//数据小于1
getDataLtOne(sb, dataSplit, b);
return sb.toString();
} else {
//数据大于1
char[] charArray = dataSplit[0].toCharArray();
for (char c : charArray) {
sb.append(c);
}
getDataGtOne(sb, dataSplit, b);
return sb.toString();
}
}
private static void getDataLtOne(StringBuffer sb, String[] dataSplit, int b) {
char[] charArray = dataSplit[1].toCharArray();
for (int i = 0; i < charArray.length; i++) {
if (i < b - 1) {
if (charArray[i] != '0')
sb.append(charArray[i]);
} else if (i == b - 1) {
sb.append(charArray[i]);
if (charArray.length > b)
sb.append(".");
} else {
sb.append(charArray[i]);
}
}
if (charArray.length < b) {
for (int i = 0; i < b - charArray.length; i++) {
sb.append("0");
}
}
}
private static void getDataGtOne(StringBuffer sb, String[] dataSplit, int b) {
if (dataSplit.length > 1) {
char[] charArray = dataSplit[1].toCharArray();
for (int i = 0; i < charArray.length; i++) {
if (i < b) {
sb.append(charArray[i]);
} else if (i == b) {
sb.append(".");
sb.append(charArray[i]);
} else {
sb.append(charArray[i]);
}
}
if (charArray.length < b) {
for (int i = 0; i < b - charArray.length; i++) {
sb.append("0");
}
}
} else {
for (int i = 0; i < b; i++) {
if (i == b)
sb.append(".");
sb.append("0");
}
}
}
}