浮点数精确表示

Posted 装逼是个坑,越陷越深

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浮点数精确表示相关的知识,希望对你有一定的参考价值。

 1 /**
 2  * 浮点数表示问题
 3  * @author husky
 4  */
 5 public class Change {
 6     public static void main(String[] args) {
 7         double num1 = 2.00;
 8         double num2 = 1.10;
 9         double num3 = 1.90;
10         // 结果:0.8999999999999999
11         System.out.println(num1 - num2);  
12         // 0.10000000000000009
13         System.out.println(num1 - num3);
14         // 1.0
15         System.out.println((num1 - num2) + (num1 - num3));
16         
17         System.out.printf("jdk5 printf : %.2f%n",num1 - num2);
18         //use BigDecimal(String): 0.90
19         //use BigDecimal(Double): 0.899999999999999911182158029987476766109466552734375
20         System.out.println("use BigDecimal(String): " + new BigDecimal("2.00").subtract(new BigDecimal("1.10")));
21         System.out.println("use BigDecimal(Double): " + new BigDecimal(2.00).subtract(new BigDecimal(1.10)));
22     }
23     /**
24      * 解析:
25      * java浮点数表示对于一些小数并不能精确的表示,只能表示成它的临界值;
26      * 但是这只是个别的,详细请参考别处
27      */
28     
29     /**
30      * 解决:
31      *  获取在使用jdk 5.0之后,通过printf得到的是正确的结果,但是底层的问题依然存在
32      *  因此对于涉及需要非常精确的结果,使用浮点数并不合适,尤其是货币运算
33      *  
34      *  方案1:
35      *  将运算进行扩大,使用int,long 进行运算,将2美元表示成200美分进行运算
36      *  
37      *  方案2:
38      *  使用BigDecimal,但要注意使用BigDecimal(String)构造器,不要使用BigDecimal(Double)
39      *  后者与上面的情况类似的
40      */
41 }

 

以上是关于浮点数精确表示的主要内容,如果未能解决你的问题,请参考以下文章

Java之浮点数运算

怎么精确提取一个浮点数的小数部分?

BigDecimal类

浮点数的十六进制表示

精确使用浮点数

浮点数的精确值作为有理数