由一个进制转换程序想到数据在计算机内的存储

本文探讨了一个程序设计题目中遇到的问题:将大位数二进制数转换为十进制数时出现的错误。通过具体的代码示例,分析了问题原因可能与计算机内部数值存储及除法运算机制相关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

闲来无事,就找了一道程序设计题来练习:编写一个应用程序,读入一个只包含0和1的整数(即二进制整数),然后打印出对等的十进制整数值。要求用求模和除法运算符。于是,我写了如下两个方法:

Code:
  1. publicstaticlongreadBinaryNum()
  2. {
  3. Scannerscan=newScanner(System.in);
  4. StringbinaryNumStr="";
  5. booleanavailable=false;
  6. do{
  7. System.out.print("请输入一个二进制整数:");
  8. binaryNumStr=scan.nextLine();
  9. available=Pattern.matches("[0-1]+",binaryNumStr);
  10. if(!available)
  11. {
  12. System.out.println("非二进制数据,此次输入无效!");
  13. continue;
  14. }
  15. if(binaryNumStr.length()>=19)
  16. {
  17. System.out.println("数据太大,此次输入无效!");
  18. available=false;
  19. continue;
  20. }
  21. }while(!available);
  22. returnLong.parseLong(binaryNumStr);
  23. }
  24. /**
  25. *把二进制数值转换为对应的十进制数值
  26. *@parambinaryNum需要转换的二进制数值
  27. *@return对应的十进制数值
  28. */
  29. publicstaticlongbinaryNum2DecimalNum(longbinaryNum)
  30. {
  31. System.out.println(binaryNum);
  32. longdecimalNum=0;
  33. intposition[]=newint[(int)Math.log10(binaryNum)+1];
  34. position[0]=(int)(binaryNum/Math.pow(10,position.length-1));
  35. for(inti=1;i<position.length;i++)
  36. {
  37. position[i]=(int)(binaryNum%(Math.pow(10,position.length-i))
  38. /(Math.pow(10,position.length-i-1)));
  39. }
  40. for(inti=0;i<position.length;i++)
  41. {
  42. decimalNum+=position[position.length-i-1]*Math.pow(2,i);
  43. System.out.print(position[i]+"");
  44. }
  45. System.out.println();
  46. returndecimalNum;
  47. }

在测试过程中我发现,如果我输入的数据是11111111111111111(即17个1),则程序转换时就出现问题了,结果是131072(而正确结果应该是131071),于是我又测试。最后发现问题出在求余运算处:

Code:
  1. longn=11111111111111111L;//17个1
  2. System.out.println(n%Math.pow(10,1));
  3. System.out.println(n%10.0);
  4. System.out.println(n%10);

程序运行,输出结果是:

Code:
  1. 2.0
  2. 2.0
  3. 1

看到这,我想到这个应该和数值在计算机内的存储结构或者除法的运算机制有关,但我不太清楚里面具体是怎么回事!于是写下此文以备忘,也希望各位看官积极讨论、指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值