我想知道,如何将小数值(例如-.06)转换为十进制或负基数。我知道-.06是负十四进制的.14,因为我可以反过来做,但用于将分数转换为其他基数的常规算法不适用于负基数。不要给出代码示例,只需解释所需的步骤。
常规算法的工作原理如下: 您按要转换的基数乘以该值。记录整数,然后继续使用剩余的部分,直到没有更多的分数:
0.337二进制:
0.337 * 2 = 0.674“0”
0.674 * 2 = 1.348“1”
0.348 * 2 = 0.696“0”
0.696 * 2 = 1.392“1”
0.392 * 2 = 0.784“0”
0.784 * 2 = 1.568“1”
0.568 * 2 = 1.136“1”
大约.0101011
答案 0 :(得分:1)
对于你的问题,我想到了这个面向对象的代码。我不确定。该类使用运算符获取两个十进制数,并创建一个等式,然后将这些数转换为小数。
public class NegadecimalNumber {
private int number1;
private char operator;
private int number2;
public NegadecimalNumber(int a, char op, int b) {
this.number1 = a;
this.operator = op;
this.number2 = b;
}
public int ConvertNumber1(int a) {
int i = 1;
int nega, temp;
temp = a;
int n = a & (-10);
while (n > 0) {
temp = a / (-10);
n = temp % (-10);
n = n * i;
i = i * 10;
}
nega = n;
return nega;
}
public int ConvertNumber2(int b) {
int i = 1;
int negb, temp;
temp = b;
int n = b & (-10);
while (n > 0) {
temp = b / (-10);
n = temp % (-10);
n = n * i;
i = i * 10;
}
negb = n;
return negb;
}
public double Equation() {
double ans = 0;
if (this.operator == '+') {
ans = this.number1 + this.number2;
} else if (this.operator == '-') {
ans = this.number1 - this.number2;
} else if (this.operator == '*') {
ans = this.number1 * this.number2;
} else if (this.operator == '/') {
ans = this.number1 / this.number2;
}
return ans;
}
}
答案 1 :(得分:0)
请注意https://en.wikipedia.org/wiki/Negative_base#To_Negative_Base告诉您如何将整数转换为负数。因此解决问题的一种方法是简单地将分数乘以100的足够高的功率以将其转换为整数,转换,然后再次分割:-0.06 = -6 / 100 => 14/100 = 0.14。
另一种方法是意识到你正在尝试创建一个形式的总和-a / 10 + b / 100 -c / 1000 + d / 10000 ...以接近目标数量,因此你想减少错误尽可能在每个阶段,但您需要在下一阶段可以纠正的方向上留下错误。请注意,这也意味着转换时分数可能不会以0开头。 0.5 => 1.5 = 1 - 5/10。
所以要转换-0.06。这是负数,小数点后的第一个数字在[0.0,-0.1 .. -0.9]范围内,所以我们从0开始,让我们转换为-0.06。现在,如果小数点后面的第一个数字是0,那么我还剩下-0.06,这是错误的方向转换为0.0d所以我需要选择小数点后面的第一个数字来产生一个低于我的目标-0.06的近似值。所以我选择了0.1,实际上是-0.1并且给我留下了0.04的误差,我可以完全转换为0.14的转换。
所以在每个点输出数字给你
1)确切的结果,在这种情况下你完成了
2)如果下一个数字为负数,则近似值略大于目标数。
3)如果下一个数字为正数,则近似值略小于目标数。
如果您开始尝试近似每个点范围内的数字(-1.0,0.0),您可以选择一个数字,使剩余误差保持足够小并且方向正确,所以这总是有效。