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
请问如何取的实际值?
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中,当的数据过大时,如何避免值的改变?的主要内容,如果未能解决你的问题,请参考以下文章