如何缩小Java程序中的舍入问题?

时间:2017-06-06 13:01:22

标签: java casting floating-point

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美元。

5 个答案:

答案 0 :(得分:4)

Narrowing Primitive Conversion

  • double to byte,short,char,int,long或float

如果浮点数不是无穷大,浮点值将四舍五入为整数值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.不要投你的价值,你会没事的。