双倍显示很长的数字

时间:2013-05-23 13:40:39

标签: java

我有一个简单的计算,使用双打,但我得到一个意想不到的结果,我不明白为什么?

import java.util.Scanner;
public class VersatileSnitSoft {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Scanner myScanner = new Scanner(System.in);
        double amount;
        System.out.print("What’s the price of a CD-ROM? ");
        amount = myScanner.nextDouble();
        amount = amount + 25.00;
        System.out.print("We will bill $");
        System.out.print(amount); 
        System.out.println(" to your credit card.");

    }

}

如果我输入2.99,我得到的结果是..

We will bill $27.990000000000002 to your credit card.

4 个答案:

答案 0 :(得分:11)

在双打(或浮点数)上操作时,不能精确表示小数值。 请改用BigDecimal

修改(2)

此处示例:

BigDecimal amount = new BigDecimal("2.99");
amount = amount.add(new BigDecimal("25.00"));
System.out.println(amount.toString());

输出:

27.99

答案 1 :(得分:2)

双打(一般浮点值)并不总是能够直观地表示我们直观地认为是精确值。这是因为存储浮动的方式,并且可能因机器和语言而异。当您尝试存储2.99时,存储的实际值可能会略有不同(例如2.990000000000002)。 This question给出了一个体面,快速的原因概述。

因此,您应该(通过链接说明)从不使用浮点基元来表示货币。使用BigDecimal,或自己跟踪两个整数(例如int dollars;int cents;)。

答案 2 :(得分:1)

使用DecimalFormat在整数后显示2位数

  DecimalFormat f = new DecimalFormat("##.00");
   String amt=f.format(amount);
   System.out.print("We will bill $");
    System.out.print(amt); 

http://www.browxy.com/SubmittedCode/21519

答案 3 :(得分:0)

我相信这个问题已被问过一百万次了。你可以在Why not use Double or Float to represent currency?

找到一个好的,快速的描述

如果你只是鬼混,你想要正确打印使用

String prettyNumber = String.format("%.2f", doubleNumber); 

打印2个浮点。它看起来是正确的,但只有在您不感兴趣的精度(大小为10 ^ -16左右)时它才是正确的。