A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

18369902839

中级黑马

  • 黑马币:-32

  • 帖子:29

  • 精华:0

© 18369902839 中级黑马   /  2016-2-28 17:09  /  1622 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我是黑马Javaee基础班的学员,在刚入学这段期间,遇到一个关于用double定义变量的问题,现在写下来,请各位大神帮忙解决一下。下面附上,学习后自己练习是写的程序
还有问题反映在了帖子跟随的两张图片上,请高手解答

/*
        超市管理系统
       
        展示商品报价单
       
        购物小票:
        让用户输入每种货物的购买数量
        计算汇总的变量
        判断总金额和少林寺两种数据是否满足打折条件,满足就打折
        打印购物小票
        数据四舍五入及强制小数转整数
*/
import java.util.Scanner;
public class Supermarket{
        public static void main (String[] args){

                //超市报价单
                int slsNumber;                                                          //编号
                String slsID ="090115";
                String slsName =  "少林寺酥饼核桃";                //名称
                double slsPrice = 15.5;                                        //单价
                String slsUnit = "公斤";                                //单位
                //char slsLevel = 'A';                                        //等级
               
               
                int skNumber;
                String skID = "090027";
                String skName =  "皇家特供尚康杂粮牡丹饼";
                double skPrice = 27.2;
                String skUnit = "公斤";
                //char skLevel = 'B';
       
                System.out.println("                     欢   迎   光   临");
                System.out.println("-------------------------------------------------------------------");
                System.out.println("商品编号         商品名称                 商品单价     商品单位");
                System.out.println();
                System.out.println(slsID+"          "+slsName+"              "+slsPrice+"        "+slsUnit);
                System.out.println(skID+"          "+skName+"      "+skPrice+"        "+skUnit);
                System.out.println();
                //解释打折活动条件
                System.out.println("本店正在举行打折活动,");
                System.out.println("凡是在本店购物满1000元且购买少林寺酥饼核桃数量30以上的,");
                System.out.println("可享受九折优惠!!!");
                System.out.println();
               
                //创建对象
                Scanner sc = new Scanner(System.in);
                //调用方法    键盘录入购买物品的数量
                System.out.println("请输入您要购买的"+slsName+"的数量:");
                slsNumber = sc.nextInt();
                double slsMoney = slsNumber*slsPrice;        //金额
               
                System.out.println("请输入您要购买的"+skName+"的数量:");
                skNumber = sc.nextInt();
                double skMoney = skNumber*skPrice;
               
               
                //购物小票
                //票头
                System.out.println("                       欢   迎   光   临");
                System.out.println("品名                     售价    数量   金额");
                System.out.println("----------------------------------------------");
               
                //判断商品名称长度,若超过七个字就截取前七个字加...
                int slsnameLenght = slsName.length();
                //判断长度是否超过七个字
                boolean a = slsnameLenght>7;
                //根据长度判断是否重新命名
                slsName = a?(slsName.substring(0,7)+"..."):(slsName);
               
                int sknameLenght = skName.length();
                boolean b = sknameLenght>7;
                skName = b?(skName.substring(0,7)+"..."):(skName);
               
                //判断总金额和少林寺两种数据是否满足打折条件,满足就打折
                double totalMoney = slsMoney+skMoney;
                totalMoney = totalMoney>=1000&&slsNumber>=30?0.9*totalMoney:totalMoney;
               
                //票体
                System.out.println(slsName+"("+slsID+")"+"   "+slsPrice+"     "+slsNumber+"    "+slsMoney);
                System.out.println(skName+"("+skID+")"+"   "+skPrice+"     "+skNumber+"    "+skMoney);
                System.out.println("----------------------------------------------");
               
                //票脚
                int kindNumber = 2;     //商品种类数
                int allNumber = slsNumber+skNumber;    //购买商品总数量
                double afterMoney = slsMoney+skMoney-totalMoney;    //商品打折所节省的价格
               
                //总金额四舍五入
                totalMoney = Math.round(totalMoney);
                //强转输出金额
                System.out.println(kindNumber+" 项商品   共计: "+allNumber+" 件");
            System.out.println("总计: "+(int)totalMoney+"  打折活动为您节省:"+afterMoney);
                System.out.println("凭此小票换取发票!");

               
               
        }

}


VB~J~TCV1AOUB]GSU1IWN)5.png (23.54 KB, 下载次数: 6)

我用double定义变量用其他两变量求积赋值给这个变量

我用double定义变量用其他两变量求积赋值给这个变量

75}_}~)7K81LDJ1QPK_~Y6Y.png (144.61 KB, 下载次数: 12)

当我键盘输入13后,原本应该为353.6的数据却变成了353.59的无限循环

当我键盘输入13后,原本应该为353.6的数据却变成了353.59的无限循环

5 个回复

倒序浏览
一看就头疼,我走了
回复 使用道具 举报
有没有大神来指点一下啊
回复 使用道具 举报
本帖最后由 zhaoxiaolang 于 2016-3-1 09:29 编辑

数字1.00就是0.999999 你用下保留两位小数的DecimalFormat。format方法  
回复 使用道具 举报
首先你要知道计算机是二进制的表示方法,也就意味着任何小数位的值都无法准确表示,只有有效位数可以确定,也就是数学上的精确到第几位的意思,所以,出现这样的情况很正常,而且这么小的数字,建议用float定义就可以了(速度快),保留两位小数就解决问题了,希望能帮到你
回复 使用道具 举报
同班的吧,javaee3期?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马