Java 小数进制转换
小数进制转换,实现任意进制转换为任意进制的方法
实现任意进制转换为任意进制的方法
废话不多上干货!
/**
* 个人数学工具
*
* @author Suage
*/
class Convert {
//可用计数字符
private static String unit = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//输入数字
private String number;
//输入进制
private int sysIn;
//输出进制
private int sysOut;
//输入实际值
private double actualValue;
//小数计算精度
private int precision;
//用于存放结果
private StringBuilder result = new StringBuilder();
/**
* 获取当前位所代表的值
*
* @param sys 进制数
* @param index 距离小数点的距离
* @param var 当前位表示字符
* @return 当前位所代表的值
*/
private double changeNI(int sys, int index, char var) {
return unit.indexOf(var) * Math.pow(sys, index);
}
/**
* 将值转化为对应进制表示字符
*
* @param sys 进制数
* @param var 值
* @return 对应进制表示字符
*/
private 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 = 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;
calculateActualValue();
Convert();
return result.toString();
}
}
public class SysConvert {
public static void main(String[] args) {
Convert Convert = new Convert();
String result = Convert.Convert(10, 16, "465.78", 10);
System.out.println(result);
}
}
/*
控制台输出:
1D1.C7AE147AE1
*/
作者:丶Suage