小言_互联网的博客

Java 小数进制转换,实现任意进制转换为任意进制的方法

355人阅读  评论(0)

废话不多上干货!

Class源码(SysConvert.java):


  
  1. /**
  2. * 个人数学工具
  3. *
  4. * @author Suage
  5. */
  6. public class SysConvert {
  7. //声明当前对象
  8. private static SysConvert instance = new SysConvert();
  9. //可用计数字符
  10. private static String unit = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  11. //输入数字
  12. private String number;
  13. //输入进制
  14. private int sysIn;
  15. //输出进制
  16. private int sysOut;
  17. //输入实际值
  18. private double actualValue;
  19. //小数计算精度
  20. private int precision;
  21. //用于存放结果
  22. private StringBuilder result = new StringBuilder();
  23. private SysConvert() {
  24. }
  25. public static SysConvert getInstance() {
  26. return instance;
  27. }
  28. /**
  29. * 获取当前位所代表的值
  30. *
  31. * @param sys 进制数
  32. * @param index 距离小数点的距离
  33. * @param var 当前位表示字符
  34. * @return 当前位所代表的值
  35. */
  36. private static double changeNI(int sys, int index, char var) {
  37. return unit.indexOf(var) * Math.pow(sys, index);
  38. }
  39. /**
  40. * 将值转化为对应进制表示字符
  41. *
  42. * @param sys 进制数
  43. * @param var 值
  44. * @return 对应进制表示字符
  45. */
  46. private static char changeIN(int sys, int var) {
  47. return unit.charAt(var);
  48. }
  49. /**
  50. * 计算实际值
  51. */
  52. private void calculateActualValue() {
  53. //检查小数点
  54. int pointIndex = number.indexOf( '.');
  55. //计算整数部分
  56. if (pointIndex < 0) { //如果没有小数部分
  57. for ( int i = 0; i < number.length(); i++) {
  58. actualValue += ( long) changeNI(sysIn, i, number.charAt(number.length() - i - 1));
  59. }
  60. } else { //有则
  61. for ( int i = 0; i < pointIndex; i++) {
  62. actualValue += ( long) changeNI(sysIn, i, number.charAt(pointIndex - i - 1));
  63. }
  64. }
  65. if (!(pointIndex < 0)) { //如果有小数部分
  66. //计算小数部分
  67. for ( int i = pointIndex + 1; i < number.length(); i++) {
  68. actualValue += changeNI(sysIn, pointIndex - i, number.charAt(i));
  69. }
  70. }
  71. }
  72. /**
  73. * 转换为指定进制
  74. */
  75. private void Convert() {
  76. //分离整数和小数
  77. long integerPart = ( long) actualValue;
  78. double decimalsPart = actualValue - integerPart;
  79. //建立字符串以用于保存结果
  80. while (integerPart >= sysOut) { //反复除进制,取余数
  81. result.insert( 0, changeIN(sysOut, ( int) (integerPart % sysOut))); //追加结果
  82. integerPart = integerPart / sysOut; //商
  83. }
  84. if (integerPart != 0) { //如果最后未被除尽
  85. result.insert( 0, changeIN(sysOut, ( int) integerPart)); //追加结果
  86. }
  87. if (decimalsPart > 0) { //如果有小数部分
  88. //添加小数点
  89. result.append( ".");
  90. for ( int t = 0; t < precision; t++) {
  91. decimalsPart = decimalsPart * sysOut;
  92. result.append(changeIN(sysOut, ( int) decimalsPart));
  93. decimalsPart = decimalsPart - ( int) decimalsPart;
  94. }
  95. }
  96. }
  97. /**
  98. * 进制转换
  99. *
  100. * @param sysIn 输入进制(Input base)
  101. * @param sysOut 输出进制(Output base)
  102. * @param number 输入数字(Input number)
  103. * @param precision 输出精度(非小数此参数无效)(Output precision (non-decimal this parameter is not valid))
  104. * @return 输出转换结果
  105. */
  106. public String Convert(int sysIn, int sysOut, String number, int precision) {
  107. this.sysIn = sysIn;
  108. this.sysOut = sysOut;
  109. this.number = number;
  110. this.precision = precision;
  111. actualValue = 0;
  112. result.delete( 0, result.length());
  113. calculateActualValue();
  114. Convert();
  115. return result.toString();
  116. }
  117. }

 

测试用源码(SysConvertTest.java):


  
  1. public class SysConvertTest {
  2. public static void main(String[] args) {
  3. SysConvert sysConvert = SysConvert.getInstance();
  4. String result;
  5. //16进制转20进制
  6. result = sysConvert.Convert( 16, 20, "ABC.DEF", 10);
  7. System.out.println(result);
  8. //10进制转16进制
  9. result = sysConvert.Convert( 10, 16, "1111.9999", 10);
  10. System.out.println(result);
  11. }
  12. }

 

控制台输出:


  
  1. 6 H8 .H86FIF0000
  2. 457 .FFF9724745

 


转载:https://blog.csdn.net/qq_33766294/article/details/105716260
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场