如何解决将分数从任何基数转换为小数 - 无法使用 BigDecimal
我正在构建一个基于数字的转换器应用程序。
我被困在如何在转换为目标基数之前将小数部分转换为小数。
例如:
用户选择 from base 16
to base 20
。
base 16
中的数字 = ab.375
我试图为这个特定示例编写的计算是:
Base 16 to decimal calculation:
(ab.375)16 = (10 × 16 ^ 1) + (11 × 16 ^ 0) + (3 × 16 ^ -1) + (7 × 16 ^ -2) + (5 × 16 ^ -3) = (171.216064453125)10
我有一个单独的方法可以正确输出小数点之前的用户输入部分。我的问题是如何考虑小数部分和 negative powers
因为 BigDecimal
pow
方法不能是 < 0
这是我的 convertToDecimalFraction
方法:
public static String convertToDecimalFraction(int sourceBase,String fraction) {
String[] fractionToConvertArray = ArrayUtilNoFraction.numberToArray(fraction);
int basePowers = -1;
BigDecimal integerToDecimalBig = BigDecimal.ZERO;
for (String s : fractionToConvertArray) {
integerToDecimalBig = integerToDecimalBig
.add(BigDecimal.valueOf(Integer.parseInt(s))
.multiply(BigDecimal.valueOf(sourceBase).pow(basePowers)));
basePowers = basePowers - 1;
}
return integerToDecimalBig.toString();
}
如果你好奇,这是我的ArrayUtilFraction.numberToArray
:
public static String[] numberToArray(String numberToConvert) {
String[] numberToConvertArray = String.valueOf(numberToConvert).split("");
String[] possibleValues = new String[]{
"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"
};
StringBuilder outputValues = new StringBuilder();
int count = 0;
for (String number : numberToConvertArray) {
for (String value : possibleValues) {
if (number.equalsIgnoreCase(value)) {
outputValues.append(count).append(" ");
break;
} else {
count = count + 1;
}
}
count = 0;
}
return outputValues.toString().split(" ");
}
解决方法
这里有一些提示。
- 没有必要持续使用
pow
函数。考虑16
的基本1EF.2DA
值。 - 幂为
3
,因为radixPoint
左边有三位数字。由于基数将为16
,因此将您的初始除数设置为
divisor = BigDecimal.pow(16,3);
- 然后,从字符串中删除小数点,给出
1EF2DA
。 - 现在,使用
b = BigDecimal.ZERO
的起始值从左到右循环数字。charToBase10
是从源基数到基数 10 的映射(例如E to 14
)
b = b.add(BigDecimal.valueOf(charToBase10.get(digit))
.multiply(divisor));
divisor = divisor.divide(sourceRadix);
- 每次循环时,都会构建
b
以包含数字。由于除数最终将小于1
,因此小数部分将逐渐出现。
这是将任何十进制小数值转换为另一个基数的快速技巧。
- 假设您想将 .45(10) 转换为基数
2
。输出将附加到位。
2*.45 = 0.90 non-fraction portion is 0 so first bit is 0
2*.90 = 1.80 non-fraction portion is 1 so next bit is 1
2*.80 = 1.60 - next bit is 1
2*.60 = 1.20 - next bit is 1
2*.20 = 0.40 - next bit is 0
2*.40 = 0.80 - next bit is 0
2*.80 = 1.60 - next bit is 1 (and we have reached a repeating point)
So the answer is
bits = .0111001[10011001100110011....]
这适用于任何基地,您需要有一张地图来映射正确的角色。您还必须确定要在整个过程中保留多少精度。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。