【发布时间】:2014-07-07 00:25:31
【问题描述】:
嘿,所以我正在尝试学习 Java,我知道浮点数不准确等等,但我现在感觉很盲目。我知道我做错了什么,电脑没有错,但我不知道在哪里。
我将数学返回值转换为整数,然后从变量 cash 中减去特定的整数值;当我从浮点数中减去整数时,浮点数似乎丢失了数据。我的问题如下:在不减慢程序速度的情况下避免数据损坏的最明智方法是什么?
<!-- language: lang-java -->
private static void calculateChange()
{
System.out.print("Please enter any amount of cash in dollars: ");
float cash = scanner.nextFloat();
int ten_dollars = (int) Math.floor(cash/10);
cash -= 10 * ten_dollars;
System.out.println(cash);
int five_dollars = (int) Math.floor(cash/5);
cash -= 5 * five_dollars;
int dollars = (int) Math.floor(cash);
cash -= dollars;
int quarters = (int) Math.floor(cash/0.25);
cash -= 0.25 * quarters;
int dimes = (int) Math.floor(cash/0.1);
cash -= 0.1 * dimes;
int nickels = (int) Math.floor(cash/0.05);
cash -= 0.05 * nickels;
int pennies = (int) Math.floor(cash/0.01);
System.out.println("This is equal to:\n" + ten_dollars + " ten dollar bills\n"
+ five_dollars + " five dollar bills\n"
+ dollars + " one dollar bills\n"
+ quarters + " quarters\n"
+ dimes + " dimes\n"
+ nickels + " nickels\n"
+ pennies + " pennies");
}
运行:
请输入任意金额的美元现金:135,04
5.0399933
这等于:
13 十美元的钞票
一张五美元的钞票
0 一美元的钞票
0 个季度
0 角钱
0 镍
3 便士
构建成功(总时间:6 秒)
【问题讨论】:
-
不要使用float来存储货币,就是这样。它们不适合那个目的。
-
"floating-points not accuracy" 浮点 is 符合 IEEE 754 的规范。它们只是不像我们期望的那样“准确”是。正如 Jack 和无数其他人所说:不要使用浮点变量来表示货币值。使用
int/long(一旦你通过了解析部分,这可能会让你的程序更快),或者如果你真的需要,使用BigDecimal(这会更慢并且比浮点更尴尬) -
您需要了解的第二件事是您的大多数 常量, 例如0.01,不能用浮点数精确表示。所以程序在执行之前并不精确:编译的常量是不精确的。您需要使用模块运算符。
-
错误,取模运算,而不是乘法。
-
我尝试将所有值乘以 100,然后将变量“cash”从 float 更改为 int 以查看它是否有效。然而它得到了错误的值。如果我使用所有整数并将数学返回为整数,为什么我得到错误数量的便士?
标签: java casting floating-point integer floating-accuracy