Java中,当的数据过大时,如何避免值的改变?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中,当的数据过大时,如何避免值的改变?相关的知识,希望对你有一定的参考价值。

public static void main(String []args)

DecimalFormat df = new DecimalFormat("#0.00");
BigDecimal bigDecimal = new BigDecimal(123456788.66f);
System.out.println("bigDecimal:"+df.format(bigDecimal));

DecimalFormat df2 = new DecimalFormat("#0.00");
float flo = new Float(1234567.54).floatValue();
System.out.println("flo:"+df2.format(flo));

float floo = 123456789f;
System.out.println("floo:"+floo);


打印结果为:
bigDecimal:123456792.00
flo:1234567.50
floo:1.23456792E8
请问如何取的实际值?

参考技术A 这个地方会出现精度的问题,原因是二进制浮点数没有办法表示所有的小数。
BigDecimal bigDecimal = new BigDecimal(123456788.66f);
这一句你不要使用BigDecimal(123456788.66f)这种构造方法,
使用BigDecimal("123456788.66")构造方法便能得到正确结果。
下面类似。
总结:一般财务或者银行系统用来进行货币计算会常常遇到这种问题,解决的办法两种,一种就是运用BigDecimal ,但是效率似乎不高,还有一种就是用分作单位,这样就能用long来表示,就不会出现精度问题。
参考技术B 1.23456792E8
不是数值变了 而是表达式不同

1.23456792E8 就是 1.23456792 * 10的8次幂

计算器也是这样表示的!
参考技术C 自己写个数据处理程序,用int数据的数学运算关系,最后转为字符串连接起来,定点数的处理速度比浮点数快很多,也不会出现精度问题。 参考技术D 用double型本回答被提问者采纳

Java模拟数据量过大时批量处理数据实现

方法一:

  代码如下: 

import java.util.ArrayList;
import java.util.List;
/**
 * 模拟批量处理数据(一)
 * 当数据量过大过多导致超时等问题可以将数据进行分批处理
 * @author 【】
 *
 */
public class BatchUtil2 {

	public static void listBatchUtil(List<Integer> lists) {
		
		System.out.println(lists);
		System.out.println(lists.size());
		int temp = 1;
		for (int i = 0; i < lists.size(); i += 10) {
			System.out.println("======================进行第" + temp + "次批处理=======================");
			if (lists.size() - i > 10) {
				System.out.println(lists.subList(i, i + 10).toString());
			} else {
				if (lists.size() > i) {
					System.out.println(lists.subList(i, lists.size()).toString());
				}
			}
			temp += 1;
		}
	}
	
	public static void main(String[] args) {
		List<Integer> lists = new ArrayList<>();
		for (int i = 1; i <= 26; i++) {
			lists.add(i);
		}
		listBatchUtil(lists);
	}
}

   实现效果:

方法二:

  代码如下:

import java.util.ArrayList;
import java.util.List;
/**
 * 模拟批量处理数据(二)
 * 当数据量过大过多导致超时等问题可以将数据进行分批处理
 * @author 【】
 *
 */
public class BatchUtil {

	public static void listBatchUtil(List<Integer> lists) {
		
		System.out.println(lists);
		// 定义批处理的数据数量(即批处理条件)
		int num = 10;
		// 判断集合数量,如果小于等于定义的数量(即未达到批处理条件),直接进行处理
		if (lists.size() <= num) {
			
			System.out.println(lists.size());
			System.out.println(lists.toString().substring(1, lists.toString().lastIndexOf("]")));
			
			return;
		}
		// 如果大于定义的数量,按定义数量进行批处理
		int  times = lists.size()/num + 1;
		
		System.out.println("一共要进行"+times+"次批处理");
		// 遍历分批处理次数,并进行批处理
		for (int i = 0; i < times; i++) {
			// 定义要进行批处理的临时集合
			List<Integer> tempList = new ArrayList<>();
			// 将要批处理数据放入临时集合中
			for (int j = i*num; j < lists.size(); j++) {
				tempList.add(lists.get(j));
				if (tempList.size() == num) {
					break;
				}
			}
			
			// 进行批处理
			System.out.println("======================进行第"+(i+1)+"次批处理=======================");
			System.out.println(tempList.size());
			System.out.println(tempList.toString().substring(1, tempList.toString().lastIndexOf("]")));
			System.out.println("=========================================================");
		}
	}
	
	public static void main(String[] args) {
		List<Integer> lists = new ArrayList<>();
		for (int i = 1; i <= 26; i++) {
			lists.add(i);
		}
		listBatchUtil(lists);
	}
}

   实现效果:

 

以上是关于Java中,当的数据过大时,如何避免值的改变?的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis中使用流式查询避免数据量过大导致OOM

避免直接改变道具,因为该值将被覆盖

Java模拟数据量过大时批量处理数据实现

[Vue 警告]:避免直接改变 prop

避免直接改变道具

避免在可重用组件中直接改变 prop