BigDecimal类的构造函数——将double类型转换为BigDecimal类型

[java]  view plain  copy
  1. package archie2010;  
  2.   
  3. import java.math.BigDecimal;  
  4. import java.math.MathContext;  
  5.   
  6. public class BigDecimalTest {  
  7.   
  8.     /** 
  9.      * @param args 
  10.      * @reference  archie2010 
  11.      * @function 实现将double类型的值转换为BigDecimal类型的值的不同途径以及各途径间的区别 
  12.      * 一:有人可能认为在 Java 中写入 new BigDecimal(0.1) 所创建的 BigDecimal 正好等于 0.1(非标度值 1,其标度为 1), 
  13.      * 但是它实际上等于 0.1000000000000000055511151231257827021181583404541015625。 
  14.      * 这是因为 0.1 无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。 
  15.      * 这样,传入 到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。  
  16.      * 二:另一方面,String 构造方法是完全可预知的:写入 new BigDecimal("0.1") 将创建一个 BigDecimal, 
  17.      * 它正好 等于预期的 0.1。因此,比较而言,通常建议优先使用 String 构造方法。  
  18.      * 三:使用public static BigDecimal valueOf(double val) 
  19.      * 使用 Double.toString(double) 方法提供的 double 规范的字符串表示形式将 double 转换为 BigDecimal。  
  20.      * 这通常是将 double(或 float)转化为 BigDecimal 的首选方法, 
  21.      * 因为返回的值等于从构造 BigDecimal(使用 Double.toString(double) 得到的结果)得到的值。  
  22.      */  
  23.     public static void main(String[] args) {  
  24.         // TODO Auto-generated method stub  
  25.         double d1,d2;  
  26.         d1 = 0.10334;  
  27.         d2 = 1234.0;  
  28.         System.out.println("直接输出double类型的值:");  
  29.         printDouble(d1, d2);  
  30.         System.out.println("将double类型直接转换为BigDecimal类型,再输出:");  
  31.         printDoubleToBigDecimal(d1, d2);  
  32.         System.out.println("将double类型转换为String类型,再转换为BigDecimal类型,再输出:");  
  33.         printDoubleToStrToBigDecimal(d1, d2);  
  34.         System.out.println("使用静态方法valueOf将double转换为BigDecimal类型并输出:");  
  35.         printDoubleToBigDecimalWithValueof(d1,d2);  
  36.         System.out.println("直接将double类型值转换为确定精度为3的BigDecimal类型值:");  
  37.         printDoubleToBigDecimalWithPrecision(d1, d2, 3);  
  38.         System.out.println("将double类型值转换为String类型再转换为确定精度(3)的BigDecimal类型值:");  
  39.         printDoubleToBigDecimalWithPrecisionAsStr(d1,d2,3);  
  40.     }  
  41.       
  42.     /** 
  43.      * @param v1:double类型; 
  44.      * @param v2:double类型; 
  45.      * @return 
  46.      * */  
  47.     public static void printDouble(double v1, double v2){  
  48.         System.out.println("d1="+v1);  
  49.         System.out.println("d2="+v2);  
  50.     }  
  51.       
  52.     /** 
  53.      * @param v1:double类型; 
  54.      * @param v2:double类型; 
  55.      * @return 
  56.      * @Constructor public BigDecimal(double val) 
  57.      * 将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。 
  58.      * 返回的 BigDecimal 的标度是使 (10scale × val) 为整数的最小值。  
  59.      * */  
  60.     public static void printDoubleToBigDecimal(double v1, double v2){  
  61.         BigDecimal d1TobigDe = new BigDecimal(v1);  
  62.         BigDecimal d2TobigDe = new BigDecimal(v2);  
  63.         System.out.println("d1TobigDe="+d1TobigDe);  
  64.         System.out.println("d2TobigDe="+d2TobigDe);  
  65.     }  
  66.       
  67.     /** 
  68.      * @param v1:double类型; 
  69.      * @param v2:double类型; 
  70.      * @return 
  71.      * @Constructor public BigDecimal(String val) 
  72.      * 将 BigDecimal 的字符串表示形式转换为 BigDecimal。 
  73.      * 字符串表示形式由可选符号 '+' ('\u002B') 或 '-' ('\u002D') 组成, 
  74.      * 后跟零或多个十进制数字(“整数”)的序列,可以选择后跟一个小数,也可以选择后跟一个指数。 
  75.      * */  
  76.     public static void printDoubleToStrToBigDecimal(double v1, double v2){  
  77.         BigDecimal d1ToStrToBigDe = new BigDecimal(String.valueOf(v1));  
  78.         BigDecimal d2ToStrToBigDe = new BigDecimal(String.valueOf(v2));  
  79.         System.out.println("d1ToStrToBigDe="+d1ToStrToBigDe);  
  80.         System.out.println("d2ToStrToBigDe="+d2ToStrToBigDe);  
  81.     }  
  82.       
  83.     /** 
  84.      * @param v1:double类型; 
  85.      * @param v2:double类型; 
  86.      * @return 
  87.      * @Constructor public static BigDecimal valueOf(double val) 
  88.      * */  
  89.     public static void printDoubleToBigDecimalWithValueof(double v1, double v2){  
  90.         System.out.println("BigDecimal.valueOf(d1)="+BigDecimal.valueOf(v1));  
  91.         System.out.println("BigDecimal.valueOf(d2)="+BigDecimal.valueOf(v2));  
  92.     }  
  93.       
  94.     /** 
  95.      * @param v1:double类型; 
  96.      * @param v2:double类型; 
  97.      * @return 
  98.      * @Constructor public BigDecimal(double val,MathContext mc)  
  99.      * */  
  100.     public static void printDoubleToBigDecimalWithPrecision(double v1, double v2, int setPrecision){  
  101.         BigDecimal d1ToBigDeWithPre = new BigDecimal(v1, new MathContext(setPrecision));  
  102.         BigDecimal d2ToBigDeWithPre = new BigDecimal(v2, new MathContext(setPrecision));  
  103.         System.out.println("d1ToBigDeWithPre="+d1ToBigDeWithPre);  
  104.         System.out.println("d2ToBigDeWithPre="+d2ToBigDeWithPre);  
  105.     }  
  106.       
  107.     /** 
  108.      * @param v1:double类型; 
  109.      * @param v2:double类型; 
  110.      * @return 
  111.      * @Constructor public BigDecimal(String val,MathContext mc) 
  112.      * 将 BigDecimal 的字符串表示形式转换为 BigDecimal, 
  113.      * 接受与 BigDecimal(String) 构造方法相同的字符串(按照上下文设置进行舍入)。  
  114.      * */  
  115.     public static void printDoubleToBigDecimalWithPrecisionAsStr(double v1, double v2, int setPrecision){  
  116.         BigDecimal d1ToStrToBigDeWithPre = new BigDecimal(String.valueOf(v1), new MathContext(setPrecision));  
  117.         BigDecimal d2ToStrToBigDeWithPre = new BigDecimal(String.valueOf(v2), new MathContext(setPrecision));  
  118.         System.out.println("d1ToStrToBigDeWithPre="+d1ToStrToBigDeWithPre);  
  119.         System.out.println("d2ToStrToBigDeWithPre="+d2ToStrToBigDeWithPre);  
  120.     }  
  121. }  

运行结果:

直接输出double类型的值:
d1=0.10334
d2=1234.0
将double类型直接转换为BigDecimal类型,再输出:
d1TobigDe=0.10334000000000000130118138486068346537649631500244140625
d2TobigDe=1234
将double类型转换为String类型,再转换为BigDecimal类型,再输出:
d1ToStrToBigDe=0.10334
d2ToStrToBigDe=1234.0
使用静态方法valueOf将double转换为BigDecimal类型并输出:
BigDecimal.valueOf(d1)=0.10334
BigDecimal.valueOf(d2)=1234.0
直接将double类型值转换为确定精度为3的BigDecimal类型值:
d1ToBigDeWithPre=0.103
d2ToBigDeWithPre=1.23E+3
将double类型值转换为String类型再转换为确定精度(3)的BigDecimal类型值:
d1ToStrToBigDeWithPre=0.103
d2ToStrToBigDeWithPre=1.23E+3

参考文献:http://www.cnblogs.com/archie2010/archive/2011/04/01/2002415.html


转自:http://www.cnblogs.com/whycxb/articles/2003856.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值