Java中要使用 BigDecimal(定点数) 进行小数的相关操作,避免使用float等浮点数

Java中要使用 BigDecimal(定点数) 进行小数的相关操作,避免使用float等浮点数,因为 float, double等浮点的存储和操作(比如:相加,相减...)存在误差(7.22f - 7.0f = 0.21999979 而不是 0.22)。

下面以 BigDecimal 进行减法为例:

/**
 * 精确的减法
 */
public static double subtract(double v1, double v2)
{
	BigDecimal d1 = new BigDecimal(Double.toString(v1));
	BigDecimal d2 = new BigDecimal(Double.toString(v2));

	return d1.subtract(d2).doubleValue();
}

// subtract(7.22d, 7.0d) == 0.22

BigDecimal 提供了 add, divide, subtract 等一系列相关的 加、减、乘、除、取模 等操作。

时间: 2025-01-07 11:33:27

Java中要使用 BigDecimal(定点数) 进行小数的相关操作,避免使用float等浮点数的相关文章

Java中的高精度整数和高精度小数

在实际编码中,会遇到很多高精度的事例,比如,在计算金钱的时候就需要保留高精度小数,这样计算才不会有太大误差: 在下面的代码中,我们验证了,当两个float型的数字相加,得到的结果和我们的预期结果是有误差的,为了减小和防止这种误差的出现,我们需要使用BigInteger类和BigDecimal类来计算. package com.ietree.base.number; import java.math.BigDecimal; import java.math.BigInteger; public c

Java中Double与BigDecimal的相互转换

今天写代码过程中,发现一个Double的变量通过new BigDecimal(Double d)转换为BigDecimal时,有效数字改变了,如下: public class BigDecimalTest { public static void main(String[] arg) { String s1 = "123.45"; Double d1 = new Double(s1); //使用String类型的形参构造BigDecimal BigDecimal bg1 = new B

java中如何使用BigDecimal使得Double类型保留两位有效数字

一.场景:从数据表中读出Decimal类型的数据直接塞给Double类型的对象时,并不会有什么异常. 如果要再此基础上计算,就会发生异常. 比如:读出数据为0.0092,将其乘以100,则变成了0.919999999999999... 二.原因: java mysql 数据类型对照如下: 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N CHAR

Java中几种常用的设置小数点后位数的方法

记录下几种常用的控制小数点后位数的方法,除了这几种还有很多方法也可以控制,但是用得不常见,下面是比较常见的几种方法 使用BigDecimal类对超长数字进行格式化控制 使用DecimalFormat格式化十进制数字 使用printf格式化输出 具体实现 package _12_26_test; import java.math.BigDecimal; import java.math.BigInteger; import java.text.DecimalFormat; /*控制小数点后位数的几

Java中常见对象——BigDecimal

当我们在开发过程中,double或者float进行加减乘除运算的时候,会出现精度丢失的情况 如下例子,我们在运算的时候均会出现精度的对视的 demo: public class BigDecimalDemo { public static void main(String[] args) { System.out.println(0.09 + 0.01); System.out.println(1.0 - 0.32); System.out.println(1.015 * 100); Syste

java中double类型显示两个小数,比如12.00

Double类型的数据如何保留两位小数? 各位大虾,现有Double类型的数据,如何转换为保留两位小数的数,返回值的类型仍然是Double类型的,而不是字符串类型. 比如     0,返回"0.00": 提示:DecimalFormat       df       =       new       DecimalFormat( "#####0.00 ");                       System.out.println(df.format(d)

Java中文件上传路径与路径修改相关问题(tomcat8.0+eclipse)

1.普通文件上传的路径: 通过getRealPath获取相关路径 String photoFolder =request.getServletContext().getRealPath("uploaded"); 打印文件路径可以得到路径就是下面这样,其实就是在工作空间下面 D:\javaWeb\workspaces\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\test\uploaded 但是如果部署项目的

关于java中“使用了未经检查或不安全的操作、有关详细信息,请使用 ——X临潼:unchecked重新编译”

今天看<算法 第4版>排序章节时,发现了一个了一个小问题.先贴一下代码: 1 public class Selection{ 2 public static void main(String[]args){ 3 Integer[]a={3,5,7,3,8,27,679,8,564,23}; 4 sort(a); 5 show(a); 6 } 7 public static void sort(Comparable<>[]a){ 8 for(int i=0;i<a.length

Map集合中,关于取值和遍历的相关操作

这是自己的关于map集合的相关操作的小研究,分享给大家. 主要代码内容包含以下: 1,map集合的遍历 2,根据key值获取value值 3,根据value值获取key值 4,返回最大value值对应的key值 5,获取最大key值,最小key值,最大value值,最小value值 上代码: 1 @Test 2 public void bb1(){//测试代码 3 Integer value=0; 4 Map<Integer,Integer> map=new HashMap<Intege