java中float,double利用BigDecimal运算

简介:

一、发现问题
float、double两种基本类型在运算的时候容易引起精度丢失。以float为例说明。
public static void main(String[] args) {
  float x = 1.0f;
  float y = 0.8f;
  float z = x - y;
  System.out.println(z);
}
结果是0.19999999


二、解决办法
利用java.math中的BigDecimal类进行操作
public static void main(String[] args) {
  float x = 1.0f;
  float y = 0.8f;

  BigDecimal x1 = new BigDecimal(Float.toString(x));
  BigDecimal x2 = new BigDecimal(Float.toString(y));
  float z = x1.subtract(x2).floatValue(); 
  System.out.println(z);
}
结果是0.2


三、注意点
注意点1
new BigDecimal(...)填写构造函数的时候,一定要使用String,而不要使用float或者double,否则同样会引起精度丢失。

注意点2
public static void main(String[] args) {
  float x = 1.0f;
  float y = 0.8f;
  BigDecimal x1 = new BigDecimal(Float.toString(x));
  BigDecimal x2 = new BigDecimal(Float.toString(y));
  x1.subtract(x2);
  System.out.println(x1);
}
x1仍然是1.0,因为不是引用类型。正确的是如下写法:

public static void main(String[] args) {
  float x = 1.0f;
  float y = 0.8f;
  BigDecimal x1 = new BigDecimal(Float.toString(x));
  BigDecimal x2 = new BigDecimal(Float.toString(y));
  x1 = x1.subtract(x2);
  System.out.println(x1);
}

本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1243197如需转载请自行联系原作者


woshixuye111

相关文章
|
2月前
|
Java
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
【Java】如果一个集合中类型是String如何使用拉姆达表达式 进行Bigdecimal类型计算?
29 0
|
4月前
|
Java
栈的简单应用(利用Stack进行四则混合运算)(JAVA)
中缀表达式转后缀表达式图解, 代码实现过程, 完整代码, 利用后缀表达式求值, 完整代码
46 0
|
5月前
|
存储 Java
百度搜索:蓝易云【Java语言之float、double内存存储方式】
由于使用IEEE 754标准进行存储,float和double类型可以表示非常大或非常小的浮点数,并且具有一定的精度。然而,由于浮点数的特性,它们在进行精确计算时可能会存在舍入误差。在编写Java程序时,需要注意使
59 0
|
4月前
|
存储 Java
你知道Java中的BigInteger类和BigDecimal类吗?
你知道Java中的BigInteger类和BigDecimal类吗?
|
10天前
|
存储 Java 数据安全/隐私保护
【Java探索之旅】运算符解密 位运算,移位运算
【Java探索之旅】运算符解密 位运算,移位运算
20 0
|
2月前
|
C#
C# 字节数组与INT16,float,double之间相互转换,字符数组与字符串相互转换,
C# 字节数组与INT16,float,double之间相互转换,字符数组与字符串相互转换,
39 1
|
2月前
|
Java 程序员
Java代码竟能如此轻松表示数学函数运算
Java代码竟能如此轻松表示数学函数运算
14 0
|
2月前
|
存储 Java
35、Java 中的 Math 类、Random 随机数、UUID、格式化字符串或数字、字符串和数字的相互转换、高精度计算、BigDecimal、计算机中的浮点数都是近似值
35、Java 中的 Math 类、Random 随机数、UUID、格式化字符串或数字、字符串和数字的相互转换、高精度计算、BigDecimal、计算机中的浮点数都是近似值
49 0
|
3月前
|
Java
Java 数学运算与条件语句全解析
Java 的 Math 类 拥有许多方法,允许您在数字上执行数学任务。 常用方法: Math.max(x, y): 找到 x 和 y 的最大值 Math.min(x, y): 找到 x 和 y 的最小值 Math.sqrt(x): 返回 x 的平方根 Math.abs(x): 返回 x 的绝对值 Math.random(): 返回一个介于 0.0 和 1.0 之间的随机数
50 1
|
4月前
|
Java 定位技术
在Java中为什么不推荐使用Float
在Java中为什么不推荐使用Float
25 1