0

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

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 is $7.50”,问题是简单地给它参数 7.50 将它转换为 7.5。

4

5 回答 5

4

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

7.5 % 107.5,并且Math.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

处理价格的正确方法是使用两个ints:一个代表美元,一个代表美分。

于 2012-09-10T19:33:13.560 回答
2

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

添加导入

import java.text.NumberFormat;  

并使用此代码

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

忘记所有模数的东西(实现您所要求的方法过于复杂且不正确)。

双打还有一个轻微的舍入问题,如果您需要完美的精度(考虑到您的代码的其余部分令人怀疑),但通常标准是使用 2 个整数来存储货币)。

于 2012-09-10T19:35:27.003 回答
2

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

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

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

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

于 2012-09-10T19:35:47.023 回答
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.5并将其Math.ceil四舍五入到8.0.

于 2012-09-10T19:32:01.293 回答
2

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

于 2012-09-10T19:33:01.433 回答