2

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

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

4 回答 4

11

在双精度数(或浮点数)上操作时,您无法精确表示十进制值。请改用BigDecimal

编辑 (2)

这里的例子:

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

输出:

27.99
于 2013-05-23T13:41:39.977 回答
2

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

因此,您应该(正如通过链接所说)永远不要使用浮点原语来表示货币。要么使用BigDecimal,要么自己跟踪两个整数(例如int dollars;int cents;)。

于 2013-05-23T13:45:51.560 回答
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

于 2013-05-23T13:50:00.240 回答
0

我相信这个问题已经被问过一百万次了。你可以在这里找到一个很好的和快速的描述为什么不使用 Double 或 Float 来表示货币?

如果您只是在鬼混,并且希望它正确打印,请使用

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

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

于 2013-05-23T13:54:27.703 回答