首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Modulus怪异

Java Modulus怪异
EN

Stack Overflow用户
提问于 2012-09-11 03:24:27
回答 5查看 269关注 0票数 0

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

代码语言:javascript
复制
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。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-09-11 03:33:14

在这段代码中,您得到8.0的原因是因为您使用了Math.ceil

7.5 % 107.5Math.ceil(7.5)8.0

然而,这是非常经常出现的事情,也是初学者非常常见的错误……价格几乎不应该以双倍的形式存储。Double算术并不总是像您期望的那样精确,主要是因为Double的实际存储方式。例如,考虑以下内容:

代码语言:javascript
复制
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:一个表示美元,另一个表示美分。

票数 4
EN

Stack Overflow用户

发布于 2012-09-11 03:32:01

试着这样做:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-09-11 03:33:01

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12358154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档