将小数部分转换为十进制的算法?

时间:2015-07-11 23:48:04

标签: algorithm math base radix

我想知道,如何将小数值(例如-.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

2 个答案:

答案 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),您可以选择一个数字,使剩余误差保持足够小并且方向正确,所以这总是有效。