Java模数很奇怪

时间:2012-09-10 19:24:27

标签: java math modulus

我编写代码来测试方法,显示食物和价格:

import java.util.Scanner;
public class JavaTutorial5Class {

        public static void main(String[] args)
        {
            greeting("Thunderdome");
            prices("Fatburger", 7.50);
        }
        static void greeting(String restaurant)
        {
            System.out.println("Welcome to "  + restaurant);
        }

        static void prices(String burger, double price){
            System.out.print(burger + " is " + "$" + price);
            //System.out.println(Math.ceil(price % 10));
            if (Math.ceil(price % 10) == 8.0){
                System.out.print("0");
            }
        }
    }

为什么price % 10 == 8.0?这真的是你需要做的就是在那里得到拖尾0吗?

编辑:所有这些代码应该是打印“Fatburger是7.50美元”问题是简单地给它参数7.50将其转换为7.5。

5 个答案:

答案 0 :(得分:4)

在此代码中,您获得8.0的原因是由于您使用Math.ceil

7.5 % 107.5Math.ceil(7.5)8.0

然而,这是经常出现的事情,对于初学者来说是一个非常常见的错误......价格几乎永远不会被存储为双打。双重算术并不总是像你期望的那样精确,主要是因为实际存储了双精度。例如,考虑一下:

double sum = 0.0;
int n = 6;
for (int i = 0; i < n; i++) {
    sum += 1.0 / n;
}
System.out.println(sum);

您希望它输出1.0,但实际上会输出0.9999999999999999

处理价格的正确方法是两个int:一个用于美元,一个用于美分。

答案 1 :(得分:2)

请改为尝试:

static void prices(String burger, double price){
    System.out.print(burger + " is $" + price);
    if ((int)(price * 10) == price * 10)
        System.out.print(0);
}

现在,7.5 % 10只返回7.5Math.ceil将这一轮归结为8.0

答案 2 :(得分:2)

价格%10实际上是7.5。 Modulu是除法的余数(或者一个数可以适合另一个数的次数)。例如,22%10是2,因为10可以适合22次,而不会超过。取上限,将其上升到最接近的整数,将其上升7.5到8.因此if语句的结果为真。

答案 3 :(得分:2)

我认为最终他想要的解决方案(以货币形式打印双倍)可以解决......

添加导入

import java.text.NumberFormat;  

并使用此代码

NumberFormat nf = NumberFormat.getCurrencyInstance(); 
System.out.print(burger + " is " + "$" + nf.format(price));

忘掉所有模数的东西(它过于复杂和不正确的方式来实现你所要求的)。

对于双打也存在轻微的舍入问题,如果你需要完美的精确度(考虑到你的其余代码可疑),但通常标准是使用2个整数来存储货币。

答案 4 :(得分:2)

使用以下命令正确格式化字符串:

System.out.printf(%s is $%.2f, burger, price)

引用此页面以获取有关字符串格式的教程:http://www.homeandlearn.co.uk/java/java_formatted_strings.html

%s将替换为burger的值,格式为字符串。
%.2f将替换为price的值,格式为十进制数,小数点后面恰好有2位。