a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 118|回复: 1

[基础知识] JAVA基础:如何应用Java的BigDecimal类

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
5.8 BigDecimal类
2 z: p4 I$ t7 g  双精度浮点型变量double可以措置16位有用数。在现实应用中,需要对更年夜或者更小的数进走运算和措置。Java在java.math包中供给的API类BigDecimal,用来对跨越16位有用位的数进行切确的运算。表5.7中列出了BigDecimal类的首要机关苹赝体例。
) o7 S; [5 }! R$ }0 |+ s3 p  表5.7 BigDecimal类的首要机关苹赝体例1 p8 p+ h8 q# S( }( Z5 g/ g
  构 造 器描 述! Q! R! Y8 ^" M( Y- W- F8 d
  BigDecimal(int)建树一个具有参数所指定整数值的对象。
; W, N+ g+ ^- L; M% d/ a& r  BigDecimal(double)建树一个具有参数所指定双精度值的对象。
, a9 ~$ c8 d9 {7 d& r# G! q- ?/ G  BigDecimal(long)建树一个具有参数所指定长整数值的对象。3 u% R' s" f/ z  G/ C# B1 G/ }
  BigDecimal(String)建树一个具有参数所指定以字符串暗示的数值的对象。
7 c: \8 M3 ~  i5 \+ q  续表0 u2 V$ s! B- _5 j/ R
  方 法描 述
! R8 H8 O/ ^) m  add(BigDecimal)BigDecimal对象中的值相加,然后返回这个对象。/ M3 J; Q8 p+ I: h
  subtract(BigDecimal)BigDecimal对象中的值相减,然后返回这个对象。8 _) ]# Q' V, I. ?
  multiply(BigDecimal)BigDecimal对象中的值相乘,然后返回这个对象。
  }8 p! G4 m5 n% O5 O1 c! D7 S  divide(BigDecimal)BigDecimal对象中的值相除,然后返回这个对象。# _! a- h: U2 A, C- T
  toString()将BigDecimal对象的数值转换成字符串。( L/ f- g: i6 n$ l2 R, e5 x
  doubleValue()将BigDecimal对象中的值以双精度数返回。
' ]+ X  y8 L- c" ^' n  floatValue()将BigDecimal对象中的值以单精度数返回。9 |7 B" q0 w  D4 @$ H/ ?
  longValue()将BigDecimal对象中的值以长整数返回。
; H% _$ i) K4 v+ w; x/ R  intValue()将BigDecimal对象中的值以整数返回。( f5 [* \6 {; u
  注重,因为一般数值类型,例如double,不能切确地代表16位有用数以上的数字,在使用BigDecimal时,应用 BigDecimal(String)机关器建树对象才有意义。此外,BigDecimal所建树的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必需挪用其相对应的体例。体例中的参数也必需是BigDecimal的对象。
0 o/ ]$ X1 ]9 i  机关器是类的非凡体例,专门用来建树对象,出格是带有参数的对象。关于机关器概念和编写手艺,将在本书第6章具体介绍。. Y: S+ Y# H, |  e9 }$ F* o  K
  下面谈判BigDecimal的一些常用例子:
6 k, \0 }/ ~  K' {
0 B4 E# E( o/ y9 X7 f. Q5 ]+ ~  `& k* w
 //完整轨类型子在本书配套资本目录Ch5中名为BigDecimalTestApp.java & @* }. h& V" `- K2 |/ B- _
  //建树BigDecimal对象 4 O6 ?+ p- z$ a- W0 v. s
  BigDecimal bigNumber = new BigDecimal("89.1234567890123456789");
) r# Z  Q& R+ b  BigDecimal bigRate = new BigDecimal(1000);
2 W$ R/ s6 b5 I  BigDecimal bigResult = new BigDecimal(); //对象bigResult的值为0.0
3 W% E* b  T* F/ |' T9 B  //对bigNumber的值乘以1000,结不美观 赋予bigResult 7 T* {# `& S& I: L; v7 Y+ x
  bigResult = bigNumber.multiply(bigRate);
8 y0 g/ p1 i( q: u  System.out.println(bigResult.toString()); 9 y8 S$ v: U" m$ Q# T( {, b* j% A
  //或者System.out.println(bigResult);
- @( u9 p8 _4 G; q  //显示结不美观:89123.4567890123456789000
! k; ~4 p+ p% `8 S3 K/ |3 i  //以双精度数返回bigNumber中的值 1 W' @$ J. [. @' o) K2 Y8 Q
  double dData = bigNumber.doubleValue(); 2 `% M' j$ R& u* [* W2 Y: t
  System.out.println(dData); //结不美观:89.12345678901235
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:28 | 显示全部楼层

JAVA基础:如何应用Java的BigDecimal类

</p>  注重使用体例doubleValue()将对象bigNumber中的值以双精度数值返回时,将丢失踪数据的切确性。使用其他体例,如xxxValue()时均存在这个问题,使用时必需稳重。
  W, e3 H! [: d  3W BigDecimal用来对跨越16有用位以上的数值进走运算和操作。所有的算术运算都经由过程挪用其响应的体例进行。建树一个跨越16有用位数的对象时,运用BigDecimal(String)才可避免丢失踪数字的切确度。
2 o( A* ]7 \& H  ]8 i  5.9 BigDecimal和名目化
/ L* `$ z: _# c9 @' R7 _  因为NumberFormat类的format()体例可以使用BigDecimal对象作为其参数,可以操作BigDecimal对超出16位有用数字的货泉值,百分值,以及一般数值进行名目化节制。
9 S3 d/ z# Q+ f) j  以操作BigDecimal对货泉和百分比名目化为例。首先,建树BigDecimal对象,进行BigDecimal的算术运算后,分袂成立对货泉和百分比名目化的引用,最后操作BigDecimal对象作为format()体例的参数,输出其名目化的货泉值和百分比,即:4 V+ E; B" N: |8 O+ w
+ g- J9 x; n1 f' `6 T2 Q
2 b' O- I3 w* ?, u( x: j
//完整轨类型子在本书配套资本目录Ch5中名为BigDecimalFormatApp.java
0 p1 R/ C( N( V: m( X' j$ r. D. e  BigDecimal bigLoanAmount = new BigDecimal(loanAmountString); . B$ X' }3 D* ]$ C, D. x" N
  //建树BigDecimal对象 - M$ c' _; |. [
  BigDecimal bigInterestRate = new BigDecimal(interestRateString);
  b# _3 Z1 I" i4 k  i% X; e! J9 a) Z  BigDecimal bigInterest = bigLoanAmount.multiply(bigInterestRate);
0 h! H$ m0 l" ~1 l3 p# F9 Z  //BigDecimal运算 , h* R6 a& T2 b0 q  \
  NumberFormat currency = NumberFormat.getCurrencyInstance();
- k( F% g# u  n# G  //成立货泉名目化引用 ! g3 a  K! p; \. K' n
  NumberFormat percent = NumberFormat.getPercentInstance();
* v5 j6 ?* u0 |3 t  o* k0 n  //成立百分比名目化引用 , F  L1 p* D" S7 j5 T8 w# S3 ^  I: X
  percent.setMaximumFractionDigits(3); //百分比小数点最多3位 0 w! O0 n& |; a
  //操作BigDecimal对象作为参数在format()中挪用货泉和百分比名目化 2 @5 {6 U& g: y" K6 W& i
  System.out.println("Loan amount:t" + currency.format(bigLoanAmount));
# f/ F1 R7 V4 j* [: n! ~  System.out.println("Interest rate:t" + percent.format(bigInterestRate)); / E4 A* R5 r& _. z9 Q* T4 F9 S* P
  System.out.println("Interest:t" + currency.format(bigInterest));
" P) Y7 `+ x$ f) U/ Y4 H+ N  如下是这个轨范运行会的一个典型输出结不美观:1 Y+ w( U7 j+ N5 S& C7 ~# m: Q4 P# A
  Loan amount: ¥129,876,534,219,876,523.12' X  H# R  C! _7 x
  Interest rate: 8.765%' e9 G/ [$ C3 t% M' t
  Interest: ¥11,384,239,549,149,661.69
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-16 10:41 , Processed in 0.170930 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表