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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

看到一段程序,其中一句不理解是什么意思,哪位高手帮忙解释一下,谢谢啦
  1. public class Score
  2.                      {
  3.                        public static void main(String[] args)
  4.                          {  
  5.                               int score;
  6.                             score=(int()(Math.random()*101);                          
  7.                               System.out.println("score="+score)
  8.                               if(score<=60)
  9.                                System.out.println("true");
  10.                               else
  11.                                 System.out.println("fault");
  12.                          }
  13.                       }
  14.                               
复制代码
第6行是什么意思?

评分

参与人数 1技术分 +1 收起 理由
admin + 1 看看童鞋们的回答!

查看全部评分

5 个回复

倒序浏览
黑马网友  发表于 2011-8-31 11:28:29
沙发
强制转换成int类型 再赋值给score 你这估码是不是括号写错了 应该是[code]int((Math.random()*101));[/code]是这样吧 应该
回复 使用道具 举报
黑马网友  发表于 2011-8-31 15:39:13
藤椅
Math.random()  是调用Math类中的random()方法 这个方法实现产生一个随机数
这随机数*101 再将其值转为int类型 再赋值给score

评分

参与人数 1技术分 +1 收起 理由
admin + 1 随机数是多少呢!再详细点说明....

查看全部评分

回复 使用道具 举报
首先,Math是java.lang包中自带的一个类,它的作用主要是提供一些与数学计算相关的方法

其中Math.random()方法的作用就是:(以下语句摘自API)
返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。

也就是说,当你调用Math.random()方法的时候,该方法会返回一个double类型的值
这个值是随机产生的,并且这个值的范围在0~1之间

下面再来看看你这行代码吧:[code=java]score=(int()(Math.random()*101);[/code]为了方便理解,我们把它拆成3行代码来看,这3行代码和那行代码的含义完全相同:[code=java]double random = Math.random();      //此时random是一个0~1之间的随机小数
double scoreDouble = random * 101;  //此时scoreDouble是一个0~101之间的随机小数
int score = (int)scoreDouble;       //将double类型的数字强制转换成int类型的数字,并赋值给Score[/code]所以,这行代码的作用就是:
随机产生一个0~100之间的整数,并将其赋值给score变量(也就是成绩)

TIPS:
其实上面的解释中,还隐含了两个疑问
第一个疑问就是:为什么要把double类型的值赋值给int类型的变量时,需要在前面加上(int)呢
这是因为,double类型的数据中包含了整数和小数部分,而int类型的数据只包含整数部分
所以,如果将double类型的值赋值给int类型的变量的话,就会丢失掉后面的小数部分的值
这里的“丢失后面小数部分的值”,用术语来说,就叫做“丢失精度”
在JAVA中,如果将一个值赋值给一个变量时会丢失精度的话,JAVA就要求必须进行类型转换
也就是说,你必须首先手动将double类型的值转变成int类型的值,才能赋值给int类型的变量
这种转换的方式就是在前面加上int()或者(int)就可以了,其中的int就代表你要将这个值转换成的类型

而第二个疑问就是:既然要获取0~100之间的整数,那为什么要让random乘以101呢?
首先,通过Math.random()方法可以随机获得0~1之间的一个小数,但是这个随机小数的范围不包含1
其次,当你通过(int)方式将double类型的数据转换成int类型的数据时,后面的小数部分不会四舍五入,而是直接被抹去
所以,由于你通过Math.random()方法获取的是一个必定小于1的小数
所以当你让这个小数乘以101的话,得到的结果就是一个必定小于101的小数
这样,当小数部分被抹去的时候,你所得到的数字就是0到100的整数了,其中就包括了0和100
[ 本帖最后由 李叶 于 2011-08-31  16:28 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
admin + 2 回答得很不错!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-31 16:23:33
报纸
Math.random()方法返回的是一个正的double类型的值,范围是>=0.0且<1.0,注意不等于1.0哦,
所以Math.random() * 101返回的范围是>=0.0且<101

教楼主一个方法,希望能帮助到你:
    Math.random() * 101这句话的话,我想你应该是看的懂,java中java.lang里面的类都是默认导入的,所以Math这个类就是java.lang包里面的,你查一下api就可以知道Math.random() 方法的作用了
    至于前面的int(),你可以先把删除掉,编译器提示的是Type mismatch: cannot convert from double to int,意思是不能将double类型的值转换成int类型的,
    在doc命令行下的提示是:
       Score.java:4: [b]可能损失精度[/b]      
       找到: double
              需要: int
              score = (Math.random() * 101);
          意思跟编译器提示的差不多,在java中出现损失精度这种错误,基本就是=(等号)两边的基本数据类型不一样的原因,并且是高精度向低精度转换的时候(即等号的右边的数据类型的精度较高,就像你的例子程序一样),解决之道就是需要进行显示的转换(int) (Math.random() * 101),而当等号右边是低精度时,编译器则会做隐式转换处理,即double score;  score = (Math.random() * 101);这样写,编译时不会报错
回复 使用道具 举报
黑马网友  发表于 2011-8-31 22:30:22
地板
谢谢李叶,回答很清楚,理解了,开始一直把101想成2进制数,不太明白。
那么101就是10进制的101吧,是为了扩大Math.random()所取值的大小了啊。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马