博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈BigDecimal类在电子商务中至关重要的地位!
阅读量:4069 次
发布时间:2019-05-25

本文共 3829 字,大约阅读时间需要 12 分钟。

<p>一提到Java里面的商业计算,我们都知道不能用float和double,因为他们无法进行精确计算。但是Java的设计者给编程人员提供了一个很有用的类BigDecimal,他可以完善float和double类无法进行精确计算的缺憾。BigDecimal类位于java.maths类包下。首先我们来看下如何构造一个BigDecimal对象。它的构造函数很多,我挑最常用的两个来演示一下:一个就是BigDecimal(double val),另一个就是BigDecimal(String str)。这两个看上去没什么太大区别,但是正像API描述中说的那样: </p> <p>view plaincopy to clipboardprint? <br>/*The results of this constructor can be somewhat unpredictable. One might assume that <br>new BigDecimal(.1) is exactly equal to .1, but it is actually equal <br>to .1000000000000000055511151231257827021181583404541015625. This is so because .1 <br>cannot be represented exactly as a double (or, for that matter, as a binary fraction <br>of any finite length). Thus, the long value that is being passed in to the constructor <br>is not exactly equal to .1, appearances nonwithstanding. <br>The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal <br>(".1") is exactly equal to .1, as one would expect. Therefore, it is generally <br>recommended that the (String) constructor be used in preference to this one.*/ <br>/*The results of this constructor can be somewhat unpredictable. One might assume that <br>new BigDecimal(.1) is exactly equal to .1, but it is actually equal <br>to .1000000000000000055511151231257827021181583404541015625. This is so because .1 <br>cannot be represented exactly as a double (or, for that matter, as a binary fraction <br>of any finite length). Thus, the long value that is being passed in to the constructor <br>is not exactly equal to .1, appearances nonwithstanding. <br>The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal <br>(".1") is exactly equal to .1, as one would expect. Therefore, it is generally <br>recommended that the (String) constructor be used in preference to this one.*/ </p> <p>也就是说利用double作为参数的构造函数,无法精确构造一个BigDecimal对象,需要自己指定一个上下文的环境,也就是指定精确位。而利用String对象作为参数传入的构造函数能精确的构造出一个BigDecimal对象。请看下面的代码: </p> <p>view plaincopy to clipboardprint? <br>import java.math.*; <br>public class TestBigDecimal { <br> public static void main(String args[]){ <br> BigDecimal bd = new BigDecimal("10.123"); <br> BigDecimal bd1 = new BigDecimal(10.123); <br> System.out.println(bd +"/n"+ bd1); <br> } <br>} <br>import java.math.*; </p> <p>public class TestBigDecimal { <br> public static void main(String args[]){ <br> BigDecimal bd = new BigDecimal("10.123"); <br> BigDecimal bd1 = new BigDecimal(10.123);</p> <p> System.out.println(bd +"/n"+ bd1); </p> <p> } <br>} </p> <p>输出: </p> <p>view plaincopy to clipboardprint? <br>10.123 <br>10.1229999999999993320898283855058252811431884765625 <br>10.123 <br>10.1229999999999993320898283855058252811431884765625 </p> <p>所以我们在选择构造函数时,要看具体需求而定。 </p> <p>另外,很多人会问到怎么将基本类型,如int,float,double,long,和BigDecimal对象相互转换。很简单: </p> <p>基本类型通过构造函数转换成对应的BigDecimal对象,而BigDecimal类提供了诸如intValue(), floatValue(), doubleValue(), longValue()方法来将BigDecimal对象转换成对应的值。 </p> <p>关于BigDecimal是如何计算的,我以论坛中一个人的提问帖子为例,来简单的写出BigDecimal的运算方法。题目是:李白无事街上走,提壶去买酒。遇店加一倍,见花喝一斗,五遇花和店,喝光壶中酒,试问李白壶中原有多少斗酒? </p> <p>这道题应该是从后往前推,并且要逆运算,最后得出原有酒的体积。 </p> <p>view plaincopy to clipboardprint? <br>import java.math.*; <br>public class Libai { <br> public static void main(String args[]){ <br> BigDecimal volumn = new BigDecimal("0"); <br> for (int i=0; i<5; i++){ <br> volumn = volumn.add(new BigDecimal("1")); <br> volumn = volumn.divide(new BigDecimal("2")); <br> } <br> System.out.print(volumn); <br> } <br>} <br>import java.math.*; </p> <p>public class Libai { <br> public static void main(String args[]){ <br> BigDecimal volumn = new BigDecimal("0"); <br> for (int i=0; i<5; i++){ <br> volumn = volumn.add(new BigDecimal("1")); <br> volumn = volumn.divide(new BigDecimal("2")); <br> } <br> System.out.print(volumn); <br> } <br>} </p> <p>结果: </p> <p>view plaincopy to clipboardprint? <br>0.96875 </p>

转载地址:http://zdaji.baihongyu.com/

你可能感兴趣的文章
uva 12260 - Free Goodies (dp,贪心 | 好题)
查看>>
uva-1427 Parade (单调队列优化dp)
查看>>
【设计模式】学习笔记13:组合模式(Composite)
查看>>
hdu 1011 Starship Troopers (树形背包dp)
查看>>
hdu 1561 The more, The Better (树形背包dp)
查看>>
【设计模式】学习笔记14:状态模式(State)
查看>>
poj 1976 A Mini Locomotive (dp 二维01背包)
查看>>
斯坦福大学机器学习——因子分析(Factor analysis)
查看>>
项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved
查看>>
linux对于没有写权限的文件如何保存退出vim
查看>>
Windows下安装ElasticSearch6.3.1以及ElasticSearch6.3.1的Head插件
查看>>
IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结
查看>>
【IntelliJ IDEA】idea导入项目只显示项目中的文件,不显示项目结构
查看>>
ssh 如何方便的切换到其他节点??
查看>>
JSP中文乱码总结
查看>>
Java-IO-File类
查看>>
Java-IO-java的IO流
查看>>
Java-IO-输入/输出流体系
查看>>
Java实现DES加密解密
查看>>
HTML基础
查看>>