double a = 1.9;
double b = 0.3;a + b 的值为什么是 2.19999999999997 
而不是 2.2

解决方案 »

  1.   

    double精度上就是这样的,关于这个方面的很多,你搜索一下~!
    NumberFormat format = new DecimalFormat("#0.00");
            double a = 1.9;
            double b = 0.3;        double d = Double.valueOf(format.format(a + b));
      

  2.   

    double,float 等浮点数是不准确的,想使用准确的,可以用BigDecimal 或者直接用 int/long 这类整数
      

  3.   

    double和float的精度问题,看我的博客你就明白了
      

  4.   

    你如果使用int 的值,去存储就是2.0,如果是double 的精度导致的
      

  5.   

    因为Java中双精度浮点数占64位,八个字节。
    如果想保留一定位数,可作如下处理!import java.text.*;
    public class DoubleTest 
    {
    public static void main(String[] args) 
    {
    DecimalFormat format = new DecimalFormat("0.0");
    double a = 1.9;
    double b = 0.3;
    double d = Double.valueOf(format.format(a + b));
    System.out.println(a+"+"+b+"="+d);//这样就是2.2了
    }
    }
      

  6.   

    java是用二进制表示double的所以有些数不会那么精确
    故会出现你那样的结果
    推荐用2楼的做法
      

  7.   

    double,float 等浮点数是不准确的
      

  8.   

    浮点型float 和双精度double都是不准确的..  二进制表示浮点型是不准的
      

  9.   

    double 和 float的精度是这样的……
    如果要按照自己的想要的格式输出的话,用format。
      

  10.   

    对于一个初学者来说,没有什么比做题更能够迅速提高的了,所以我很感谢LZ给我这个练习的机会,历时2个小时,基本达到要求。
    实现:
    多商品输入,统一输出,单价数量合计,税率计算;
    未实现:
    多单统一输入,统一分单输出。import java.io.*;
    import java.util.*;
    import java.text.*;public class Pos {
    public static void main(String[] args) throws Exception{
    NumberFormat format = new DecimalFormat("#0.00");
    boolean estimate = false;
    double cess;
    double summation = 0;
    double cessed;
    String in = null;
    List l = new ArrayList();

    BufferedReader dis = new BufferedReader(new InputStreamReader(System.in));

    System.out.println("输入商品税率:");
    cess = Double.parseDouble(dis.readLine());
    while ( in != "exit") {
    System.out.println("请输入一个商品,输入exit则结束输入:");
    System.out.println("输入商品名称(以回车键结束):");
    in = dis.readLine();
    if (in.equals("exit")) {
    System.out.println("系统退出,打印数据.");
    break;
    }
    Commodity cd = new Commodity();
    cd.name = in;
    System.out.println("输入商品数量(以回车键结束):");
    in = dis.readLine();
    while (estimate == false) {
    estimate = true;
    try {
    cd.amount = Double.parseDouble(in);
    } catch (NumberFormatException e ) {
    System.out.println("输入错误,重新输入商品数量(以回车键结束):");
    in = dis.readLine();
    estimate = false;
    }
    }
    estimate = false;
    System.out.println("输入商品单价(以回车键结束):");
    in = dis.readLine();
    while (estimate == false) {
    estimate = true;
    try {
    cd.price = Double.parseDouble(in);
    } catch (NumberFormatException e ) {
    System.out.println("输入错误,重新输入商品单价(以回车键结束):");
    in = dis.readLine();
    estimate = false;
    }
    }
    l.add(cd);
    estimate = false;

    for (int i = 0; i < l.size(); i++) {
    Commodity cTemp = (Commodity)l.get(i);
    System.out.println(cTemp);
    summation = summation + (cTemp.amount * cTemp.price);
    }
    cessed = summation * cess;
    System.out.println("税款:" + format.format(cessed));
    System.out.println("总计:" + format.format(summation));
    }
    }
    class Commodity {
    public double amount;
    public String name = null;
    public double price;
    Commodity () {
    }
    Commodity (double amount,String name,double price) {
    this.amount = amount;
    this.name = name;
    this.price = price;
    }
    public String toString() {
    return amount + "  " + name + ":  " + price;
    }

    }