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

Java 小数进制转换,实现任意进制转换为任意进制的方法废话不多上干货 个人数学工具 authorSuage classConvert 可用计数字符 privatestati 0ABCDEFGHIJK 输入数字 privateStrin 输入进制

废话不多上干货!

Class源码(SysConvert.java):

/ * 个人数学工具 * * @author Suage */ public class SysConvert { //声明当前对象 private static SysConvert instance = new SysConvert(); //可用计数字符 private static String unit = "0ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //输入数字 private String number; //输入进制 private int sysIn; //输出进制 private int sysOut; //输入实际值 private double actualValue; //小数计算精度 private int precision; //用于存放结果 private StringBuilder result = new StringBuilder(); private SysConvert() { } public static SysConvert getInstance() { return instance; } / * 获取当前位所代表的值 * * @param sys 进制数 * @param index 距离小数点的距离 * @param var 当前位表示字符 * @return 当前位所代表的值 */ private static double changeNI(int sys, int index, char var) { return unit.indexOf(var) * Math.pow(sys, index); } / * 将值转化为对应进制表示字符 * * @param sys 进制数 * @param var 值 * @return 对应进制表示字符 */ private static char changeIN(int sys, int var) { return unit.charAt(var); } / * 计算实际值 */ private void calculateActualValue() { //检查小数点 int pointIndex = number.indexOf('.'); //计算整数部分 if (pointIndex < 0) {//如果没有小数部分 for (int i = 0; i < number.length(); i++) { actualValue += (long) changeNI(sysIn, i, number.charAt(number.length() - i - 1)); } } else {//有则 for (int i = 0; i < pointIndex; i++) { actualValue += (long) changeNI(sysIn, i, number.charAt(pointIndex - i - 1)); } } if (!(pointIndex < 0)) {//如果有小数部分 //计算小数部分 for (int i = pointIndex + 1; i < number.length(); i++) { actualValue += changeNI(sysIn, pointIndex - i, number.charAt(i)); } } } / * 转换为指定进制 */ private void Convert() { //分离整数和小数 long integerPart = (long) actualValue; double decimalsPart = actualValue - integerPart; //建立字符串以用于保存结果 while (integerPart >= sysOut) { //反复除进制,取余数 result.insert(0, changeIN(sysOut, (int) (integerPart % sysOut))); //追加结果 integerPart = integerPart / sysOut;//商 } if (integerPart != 0) { //如果最后未被除尽 result.insert(0, changeIN(sysOut, (int) integerPart)); //追加结果 } if (decimalsPart > 0) { //如果有小数部分 //添加小数点 result.append("."); for (int t = 0; t < precision; t++) { decimalsPart = decimalsPart * sysOut; result.append(changeIN(sysOut, (int) decimalsPart)); decimalsPart = decimalsPart - (int) decimalsPart; } } } / * 进制转换 * * @param sysIn 输入进制(Input base) * @param sysOut 输出进制(Output base) * @param number 输入数字(Input number) * @param precision 输出精度(非小数此参数无效)(Output precision (non-decimal this parameter is not valid)) * @return 输出转换结果 */ public String Convert(int sysIn, int sysOut, String number, int precision) { this.sysIn = sysIn; this.sysOut = sysOut; this.number = number; this.precision = precision; actualValue = 0; result.delete(0, result.length()); calculateActualValue(); Convert(); return result.toString(); } }

 

测试用源码(SysConvertTest.java):

public class SysConvertTest { public static void main(String[] args) { SysConvert sysConvert = SysConvert.getInstance(); String result; //16进制转20进制 result = sysConvert.Convert(16, 20, "ABC.DEF", 10); System.out.println(result); //10进制转16进制 result = sysConvert.Convert(10, 16, "1111.9999", 10); System.out.println(result); } }

 

控制台输出:

6H8.H86FIF0000 457.FFF

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221087.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午6:57
下一篇 2026年3月17日 下午6:57


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号