源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Java中使用BigDecimal进行浮点数运算

  • 时间:2022-09-23 07:22 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Java中使用BigDecimal进行浮点数运算
最近研究了一下Java的浮点数计算问题,从网上查询了相关的资料,汇总并经过了一些整理和调试,最后完成此文,欢迎大家指出其中的错误和问题。 在Java中,float声明的变量是单精度浮点数,double声明的变量是双精度浮点数,顾名思义就是double型的实体占用内存空间是float的两倍。float是4个字节而double是8个字节。float和double类型的数据,无法精确表示计算结果,这是由于float和double是不精确的计算。大家可以通过下面代码可以看出来:
[u]复制代码[/u] 代码如下:
public class Test { public static void main(String[] args) { System.out.println(0.05 + 0.01); System.out.println(1.0 - 0.42); System.out.println(4.015 * 100); System.out.println(123.3 / 100); } }
运行的结果为: 0.060000000000000005 0.5800000000000001 401.49999999999994 1.2329999999999999 要想获得理想的效果,我们可以尝试使用java.text.DecimalFormat格式化浮点数: DecimalFormat可以按照一定的格式格式化数字,常用的格式化字符是#、0等。例:
[u]复制代码[/u] 代码如下:
System.out.println(new java.text.DecimalFormat("0.00").format(3.125)); System.out.println(new java.text.DecimalFormat("0.00").format(3.135));
但是得到的结果是: 3.12 3.14 这是因为DecimalFormat是使用half-even 舍入(ROUND_HALF_EVEN),简单的说就是向当四舍五入的5的时候向最近的偶数靠。所以使用DecimalForamt也无法得到可靠的浮点数。最后我们可以考虑使用BigDecimal来获得更精确的计算: BigDecimal提供了多个构造函数,和浮点数有关的有:
[u]复制代码[/u] 代码如下:
BigDecimal(double val)  Translates a double into a BigDecimal. BigDecimal(String val)  Translates the String repre sentation of a BigDecimal into a BigDecimal.
但是用double参数来创建对象得到不精确的值,只有通过String来创建对象才是最准确的。 例如:
[u]复制代码[/u] 代码如下:
BigDecimal bd1=new BigDecimal(0.05); System.out.println(bd1.toString()); BigDecimal bd2=new BigDecimal("0.05"); System.out.println(bd2.toString());
得到结果: 0.05000000000000000277555756156289135105907917022705078125 0.05 所以,我们最终需要使用String来创建对象,这样得到的结果才是最精确的。另外,如果是double数,我们还可以使用:BigDecimal.valueOf(double val),原因很简单,其JDK源码如下所示:
[u]复制代码[/u] 代码如下:
public static BigDecimal valueOf(double val) { return new BigDecimal(Double.toString(val)); }
最后需要说明的是:BigDecimal的加减乘除其实最终都返回的是一个新的BigDecimal对象,因为BigDecimal是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以a.add(b);虽然做了加法操作,但是a并没有保存加操作后的值,正确的用法应该是a=a.add(b)。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部