我有一个简单的计算,使用双打,但我得到一个意想不到的结果,我不明白为什么?
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.
答案 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);
答案 3 :(得分:0)
我相信这个问题已被问过一百万次了。你可以在Why not use Double or Float to represent currency?
找到一个好的,快速的描述如果你只是鬼混,你想要正确打印使用
String prettyNumber = String.format("%.2f", doubleNumber);
打印2个浮点。它看起来是正确的,但只有在您不感兴趣的精度(大小为10 ^ -16左右)时它才是正确的。