1.代码
public static void main(String args[]) {
double a = 11540.0;
double b = 0.35;
double result = a * b;
System.out.println("控制台输出:"+a + " * " + b + " = " + result);
System.out.println("计算器正确是:" + 4039 );
}2.输出
控制台输出:11540.0 * 0.35 = 4038.9999999999995
计算器正确是:40393.问题
计算器能计算准确,但是如果我在程序中这样操作却出现了不精确的情况
如何能满足我类型是double,但是计算结果又精确一点的?
或者还有什么更好的替换方法?4.贴尾
请高手指教,临帖涕零,不知所言。

解决方案 »

  1.   

    double a = 11540.0;
    double b = 0.35;
    double result = a * b;
    BigDecimal a1 = new BigDecimal(Double.toString(a));
    BigDecimal b1 = new BigDecimal(Double.toString(b));
    BigDecimal result1 = a1.multiply(b1);
    System.out.println("控制台输出:" + a + " * " + b + " = " + result);
    System.out.println("控制台输出2:" + a1 + " * " + b1 + " = " + result1);
    System.out.println("计算器正确是:" + 4039);控制台输出:11540.0 * 0.35 = 4038.9999999999995
    控制台输出2:11540.0 * 0.35 = 4039.000
    计算器正确是:4039
      

  2.   

    如果你想用double,精度不能保证足够高。
    在有些情况下,可以用化整法。比如你上面两个数,可以都用整型定义,a=11540,b=35,得到结果以后除以100。或者用字符串法,自己写精确的逐位运算方法。
    或者痛苦一点,用四舍五入保留若干位小数的方法。
      

  3.   

    float resf=(float)result;
            System.out.println("控制台输出:"+a + " * " + b + " = " + resf);
      

  4.   

    至于原因 我个人认为是double的精度问题
      

  5.   

    float精度更低,这个结果正确属于精度过于不够……
      

  6.   

    我应该没说float精度比double高吧
      

  7.   

    BigDecimal这个类专门用来做精度相关的运算。最好还是用这个吧。
      

  8.   


        double a = 11540.0;
        double b = 0.35;
        
        double result = a * b;
        System.out.println("控制台输出:"+a + " * " + b + " = " + result);
        System.out.println("计算器正确是:" + 4039 );
        
        
       
        BigDecimal aa = new BigDecimal("11540.0");
        BigDecimal bb = new BigDecimal("0.35");    result = aa.multiply(bb).doubleValue();    
        System.out.println("控制台输出:"+a + " * " + b + " = " + result);
        System.out.println("计算器正确是:" + 4039 );控制台输出:11540.0 * 0.35 = 4038.9999999999995
    计算器正确是:4039
    控制台输出:11540.0 * 0.35 = 4039.0
    计算器正确是:4039
      

  9.   

    一般银行系统使用的是BigDecimal 吗,请高人回答。
      

  10.   

    BigInteger大数的原理是通过数组来转存数据再运算,然后输出。
      

  11.   

    十分感谢各位的积极争论和回复
    如果用java做一些财务管理系统,那么对于金钱方面,一般做开发的,都要选择BigDecimal 是吗
      

  12.   

    我的意思是:
    如果用java做一些关于财务方面的管理系统
    毕竟要涉及到精确的金钱计算,那么我们都必须选择BigDecimal 
    而不去选择double 是这样吗
      

  13.   


    既然存在了这么一个数据类型,那么必有他存在的理由。我想,sun当时也考虑到了。所以,要求高精度的数据时,还是用BigDecimal 吧~特别是金融,科研领域中,有时候差一个数据,也会造成很坏的结果
      

  14.   

    我的意思是:
    如果用java做一些关于财务方面的管理系统
    毕竟要涉及到精确的金钱计算,那么我们都必须选择BigDecimal  
    而不去选择double 是这样吗
      

  15.   

    用BigDecimal来进行计算,精度要高;
    尤其是有关金额方面的数据,一般都用这个。
      

  16.   

    财务方面一般都是采用最小单位制计算的,BigDecimal精度虽然可以但是运算效率很低比如说20元3角4分,财务一般是用2034分去计算
      

  17.   

    查了一下 感觉还是double精度高   我记得他有些方法 有的是四舍五入 有的是直接舍弃  是不是方法有问题!
      

  18.   

    java 的double的精度本身就是有问题,所以当你遇到double类的值进行计算精度不准确时,不要感到意外,解决方法2楼说得很好了
      

  19.   


    import java.math.BigDecimal;public class GenericT {
    public static void main(String[] ag){
    double a = 11540.0;
    double b = 0.35;
    double c = 35 ;
    double result1 = a * b;
    BigDecimal a1 = new BigDecimal(Double.toString(a));
    BigDecimal b1 = new BigDecimal(Double.toString(b));
    BigDecimal result2 = a1.multiply(b1);
    System.out.println("result1:" + a + " * " + b + " = " + result1);
    System.out.println("result2:" + a1 + " * " + b1 + " = " + result2);
    System.out.println("计算器正确是:" + 4039);double result3 = a * c/100;
    System.out.println("控制台输出3:" + a + " * " + c + " = " + result3);
        }
    }