double类型数据进位,转string

首先祝大家愚人节快乐,今天是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");
			}
		}
	}
}


猜你喜欢

转载自blog.csdn.net/qq_14861089/article/details/68941101
今日推荐