public class Rest {
public static void main(String[] args) {
double mealCost;
int tipPercent;
int taxPercent;
double totalCost;
Scanner scan = new Scanner(System.in);
mealCost = scan.nextDouble();
tipPercent = scan.nextInt();
taxPercent = scan.nextInt();
double tipInD = mealCost * (double)tipPercent / 100;
double taxInD = mealCost * (double)taxPercent / 100;
totalCost = (double)mealCost + (double)tipInD + (double)taxInD;
System.out.println("The total meal cost is "+(int)totalCost+" dollars.");
}
}
这是我创建的程序,我必须传递4个不同的输入案例,其中3个传递此代码,但第四个1 am不能。
具有预期o / p的输入案例。
输入第1至第3个案例
---------
12.00 20 8
----------
15.50 15 10
----------
20.75 10 3
第1次 - 第3次的输出
---------
The total meal cost is 15 dollars.
---------
The total meal cost is 19 dollars.
---------
The total meal cost is 23 dollars.
对于第四种情况,我写的代码无法为其提供所需的O / P.
输入
--------
10.25
17
5
输出
总餐费为13美元。 而且我得到的总餐费是12美元。
答案 0 :(得分:4)
如果浮点数不是无穷大,浮点值将四舍五入为整数值V,使用IEEE 754向零舍入模式舍入为零(§4.2。 3)。然后有两种情况:
如果T很长,并且这个整数值可以表示为long,那么第一步的结果就是长值V.
否则,如果此整数值可以表示为int,则第一步的结果是int值V.
(int)totalCost => (int) 12.504999999999999 => 12 (decimal part stripped)
相反,您可能希望使用Math.round( totalCost )
来获取最接近的整数值。
Math.round( totalCost ) => Math.round( 12.504999999999999 ) => 13
答案 1 :(得分:2)
我认为,根据您的预期,您只想打印:
System.out.println("The total meal cost is " + Math.round(totalCost) + " dollars.");
而不是。
System.out.println("The total meal cost is " +(int)totalCost + " dollars.");
第一个将根据数学规则正确舍入,第二个将只是浮点值的条带。这就是为什么最后一个导致12
而不是13
的原因,因为它实际上并不是圆的。
答案 2 :(得分:2)
更改您将totalCost
写入:
System.out.println("The total meal cost is "+ Math.round(totalCost) +" dollars.");
这实际上会根据应该计算的输出来舍入,而不是直接去除小数值。
答案 3 :(得分:1)
正在运行的解决方案是将输出更改为
System.out.println("The total meal cost is " + (int) Math.ceil(totalCost) + " dollars.");
可以找到解释here
答案 4 :(得分:0)
您正在将double值转换为整数值。请注意,通过这样做,您可以在小数点处剪切数字,并且不会涉及舍入。您的计算是10.25*0.17 + 10.25*0.05 + 10.25 = 12.505
通过应用演员,你得到12而不是13.不要投你的价值,你会没事的。