Java认证之Java中实现浮点数的精确运算) i) J5 o$ j# z+ @( c3 j6 S
在Java中实现浮点数的精确运算) [1 Z" d9 \; ^1 W) f' C
package com.lv;
; V4 O3 @1 T1 [2 a+ Yimport java.math.BigDecimal;7 z+ @& ` l" w w
public class Arith {7 e4 J5 X* v2 Z+ w
public static double add(double v1,double v2){/ s3 a0 U' i& r* L+ m
BigDecimal b1=new BigDecimal(Double.toString(v1)); N( g) u* E9 m& N2 {7 i
BigDecimal b2=new BigDecimal(Double.toString(v2));
6 j# L; l% u& f& Z- dreturn b1.add(b2).doubleval_rue();' ^' ]* W+ x, ~4 n' D! \
}3 m! x4 i1 p4 H; O, h8 O
public static double sub(double v1,double v2){
7 J# l# A. ?" N4 _% VBigDecimal b1=new BigDecimal(Double.toString(v1));, j+ y9 M0 U; N C- s- U
BigDecimal b2=new BigDecimal(Double.toString(v2));- k/ q: S$ {# k) ~# M( D
return b1.subtract(b2).doubleval_rue();
; ?* w9 q- q! x1 E}# K. |# @# K8 [' H/ X0 ]8 y
public static double mul(double v1,double v2){. N6 Z1 G( m% |' q6 B7 |3 s
BigDecimal b1=new BigDecimal(Double.toString(v1));
; y* a6 h7 Q& x% ?& K- PBigDecimal b2=new BigDecimal(Double.toString(v2));
7 t( O$ v7 J# w" X. sreturn b1.multiply(b2).doubleval_rue();6 a& @2 z$ b- ], ?' o, H
}
( s% o4 B- E9 q7 F4 kpublic static double div(double v1,double v2){+ |; l: h# s3 ?; T
BigDecimal b1=new BigDecimal(Double.toString(v1));
) ^% J: C6 }4 M: Z# s1 d3 nBigDecimal b2=new BigDecimal(Double.toString(v2));7 Q) @7 K) S; A) E
return b1.divide(b2,10,BigDecimal.ROUND_HALF_UP).doubleval_rue();3 i4 P+ S) l& c# d1 L4 K% N* o
}) Q$ {. k9 x$ L' L6 l5 O
6 _" n1 T3 [# C d8 J7 k) S+ T% D" b
% B! V% N0 E6 L9 s: C8 K1 ]public static double div(double v1,double v2,int scale){& M5 a i+ O3 I2 v4 ?: E. O
if(scale《0){" }' j. ~6 I4 M8 R T
throw new IllegalArgumentException(
' Z/ p9 n2 ]- u$ p6 P3 u4 G" J“The scale must be a positive integer or zero”);; C- p1 m. O! z% i2 ]" O7 r! a
}6 T, K1 z4 D8 _4 D o( N/ G
BigDecimal b1=new BigDecimal(Double.toString(v1));
7 T. j/ I5 g+ ?4 U% \BigDecimal b2=new BigDecimal(Double.toString(v2));9 t) G/ n: o. U' g& j$ G. H+ W) U
return b1.divide(b2, scale,BigDecimal.ROUND_HALF_UP).doubleval_rue();# S b3 [ X' g. P+ Z) S
}
9 f5 g0 g! q4 B4 Dpublic static double round(double v,int scale){. b; ?! V1 z0 Q8 R- V
if(scale《0){% G9 w1 B Q( ]5 t$ ^. D& x
throw new IllegalArgumentException(
1 s' S% `9 j- s' E C3 U4 U6 y; y“The scale must be a positive integer or zero”);
/ ~$ e3 ^' D+ K}8 Q5 t& p' h a5 w+ a; j
BigDecimal b=new BigDecimal(Double.toString(v));
( D. ~/ T! c8 [) z$ NBigDecimal one=new BigDecimal(1);
' i4 P' _& j$ k; x8 k, sreturn b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleval_rue(); T2 ?9 }, {; G6 @( S+ Q- }& @
}7 v+ m( Q; d9 G6 f: O. z9 b
public static void main(String [] args){
" y6 ~/ T+ |1 g2 q) ]& I' FArith arith=new Arith();1 @! R$ s7 a2 ]
System.out.println(arith.div(13,3));
3 |) p( }6 a1 c; T" `9 a8 D}/ f: ^, f# M6 A r- i {
} |