【问题标题】:How do I get a certain decimal-place of a number?如何获得数字的某个小数位?
【发布时间】:2020-09-30 06:26:28
【问题描述】:

我想实现 RadixSort 并获取特定小数位的数字。

 int num (int elem, int place)
      --- if element == 12225 and place == 0
      --- expected output would be 5 (starting to count by right) 
      --- if place == 4 expected output would be 1

我写了这个方法。但它既不工作也不高效。

    static int key(int element, int decimalPlace) {
        if (element < 0)
            throw new IllegalArgumentException("invalid argument");
        int tmp = (int) (Math.log10(element) + 1);
        if (decimalPlace > tmp)
            return 0;
        else {
            return Integer.parseInt(String.valueOf(Integer.toString(element).charAt(tmp - decimalPlace)));
        }
    }

我想我应该能够更有效地解决这个问题

【问题讨论】:

  • 也许只是 1) 将十进制数字打印成字符串,然后 2) String.charAt() 你想要的数字?
  • 或者,将十进制数乘以 10 到所需数字所在位置的幂(因此它成为小数点前的最后一位),将其转换为 int 并计算除以 10 的模块 (% 10)
  • 抱歉,“十进制”是指以 10 为底:然后(如果是 int),除以 10 到您想要的位置的幂,然后得到除以 10 的模块。比如12345中的第三个位置:(12345 / 100) % 10
  • its neither working: ypur 代码对于 12225 中的 1 或 4 位的实际结果是什么?或者你得到了什么错误?

标签: java sorting decimal


【解决方案1】:
class FindDecimalPosition
{
    public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println(getNumber(1234567,0));
        System.out.println(getNumber(1234567,1));
        System.out.println(getNumber(1234567,2));
        System.out.println(getNumber(1234567,3));
        System.out.println(getNumber(1234567,4));
        System.out.println(getNumber(1234567,5));
        System.out.println(getNumber(1234567,6));
    }


    public static int getNumber(int num,int position){
        char [] aux = (num+"").toCharArray();

        if(position >= aux.length || position < 0 || num < 0) throw new IllegalArgumentException("invalid argument");
        return Integer.valueOf((aux[aux.length - position-1]+""));
    }
}

【讨论】:

  • 对 IllegalArguments 的强大检查 ? 负输入会发生什么,例如num = -1? position == aux.length 有什么用?
【解决方案2】:

你可以通过两种方式解决:

对其十进制表示使用字符串运算

从正整数的十进制字符串表示中选择字符(数字):

int getDigitAtPosition(Integer integer, int zeroBasedPositionFromRight) {
  // raise error if pos < 0 or pos >= length or length == 0
  decimalRepresentation = integer.toString();
  int rightMostPosition = decimalRepresentation.length() - 1;
  int indexOfDigit = rightMostPosition - zeroBasedPositionFromRight;
  char digitChar = decimalRepresentation.charAt(indexOfDigit);

  return Integer.parseInt(digitChar);
}

使用数学(简单步骤)

或者您可以通过 (a) 使用更高的 10 次方的模数来计算它;然后 (b) 减去较低的 10 次幂(包括它的模数);最后 (c) 除以 pos-power-10:

得到 1234 的 pos 1 位数 = 3

变为 (a) 10^(1 +1) = 减去 100er 因子

减去 1200,得到 34

然后 (b) 10^(1 -1) = 减去 1er

减去4,得到30

最后 (c) 整数除以 10^(1)(忽略可能的余数)

30 / 10 = 3 所需数字的值

int getDigitAtPosition(Integer integer, int pos) {
  // raise error if pos < 0 or pos >= length or length == 0
  int higherUnit = 10^(pos +1) ; // a
  int higherPart = (integer / higherUnit) * higherUnit;
  int lowerUnit = 10^(pos -1); // b
  int lowerPart = (integer / lowerUnit) * lowerUnit;
  int posUnit = 10^(pos); // c
  int digitAtPosition = (integer - higherPart - lowerPart) / posUnit;

  return digitAtPosition;
}

使用数学(pow 和模)

参见related answer 利用模数运算

更一般地,一个数的第n位可以通过以下公式获得:(number / base^(n-1)) % base

【讨论】:

    【解决方案3】:

    我愿意:

    return ( element / (int) Math.pow(10, decimalPlace) ) % 10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2011-01-20
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 2021-05-08
      相关资源
      最近更新 更多