【问题标题】:Converting decimals to sexagesimal (base sixty) in javascript在javascript中将小数转换为六十进制(以六十为底)
【发布时间】:2010-10-14 00:06:47
【问题描述】:

将十进制数(以 10 为基数)转换为以 0-9、A-Z 和 a-x 作为数字的字符串表示的六十进制数(以 60 为基数)的最佳方法是什么。

我打算用 javascript 编写代码,但感谢任何帮助。

用法示例:

>>decToSex(60);
"10"
>>decToSex(123);
"23"
>>decToSex(1000000);
"4bke"
>>decToSex(1234567.89);
"5gu7.rO"

我使用的最终代码,基于 Paolo 的回答:

var decToSex = function(){
    var decToSexMap = ['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',
            'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x'];

    return function(number){

        var negative = '';
        if (number < 0){
            var negative = '-';
        }

        number = number.toString().split('.');
        var integer = Math.abs(number[0]);
        var fraction = number[1];
        var result = '';

        do {
            result = decToSexMap[integer % 60] + result;
            integer = parseInt(integer / 60);
        } while (integer > 0);

        if (fraction){
            var decimalPlaces = fraction.toString().length;
            result += '.';
            fraction = parseFloat('.' + fraction);

            var x = 0;
            do {
                x++;
                var res = (fraction * 60).toString().split('.');
                result = result + decToSexMap[res[0]];

                if (res[1]) {
                    fraction = parseFloat('.' + res[1]);
                }
                else {
                    break;
                }
            } while (x < decimalPlaces);
        }
        return negative + result;
    }
}();

【问题讨论】:

  • 不错的函数名称,但不幸的是,性别意味着 6,而不是 60 :-(
  • 哦,那我得想个办法了。也许 Sexage 作为 Sexage-nary 循环使用它?
  • 所有的数学题都让我头疼,但我认为我的答案可以解决问题。
  • 是的,保罗,好像是这样。正要发布我的版本,谢谢:)
  • 酷,干得好。完全忘记了负面因素。

标签: javascript


【解决方案1】:

只需将它反复除以 60,直到剩下零。每次,获取模数,并将其转换为适当的字符,并将其添加到您的输出字符串中。

编辑:对于小数,假设您要搜索最多 3 个 60 位小数:

从 0.98765(以 10 为底)开始

0.98765 * 60 -> 59.259 -> first post-decimal character is 59 converted to its 60decimal character, then carry the .259
.259 * 60 -> 15.54 -> second char is 15 converted to its 60decimal character, then carry the .54
.54 * 60 -> 32.4 -> round it this time (its the last char) -> last char is 32 as its 60dec char

所以 0.98765(以 10 为底)变为 0.[59] [15] [32](基数 60)

【讨论】:

  • 如何处理分数:1234567.89 -> "5gu7.rO" ?
  • 您需要先指定要计算的小数位数,然后从那里开始工作。
【解决方案2】:

这适用于提供的测试数据,但您可能想对其进行更多测试:

<script>
var convert = new Array(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','a',
                       'b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
                       'r','s','t','u','v','w','x');

function decToSex(num) {
    var extract = num.toString().split('.');
    num = extract[0];
    var pieces = new Array();
    do {
        pieces.push(convert[num % 60]);
        num = parseInt(num/60);
    } while (num > 0);
    pieces = pieces.reverse();
    var rem = extract[1];
    if(rem) {
        rem = parseFloat('.' + rem);
        var x = 0;
        var dec = new Array();
        do {
            x++;
            var res = (rem * 60).toString().split('.');
            dec.push(convert[res[0]]);
            if(res[1]) {
                rem = parseFloat('.' + res[1]);
            } else {
                break;
            }
        } while (x < 3); // work up to 3 decimal places, change for more.
    }
    var myResult = pieces.join('');
    if(dec) {
        myResult += '.' + dec.join('');
    }
    return myResult;
}

alert(decToSex(60));
alert(decToSex(123));
alert(decToSex(1000000));
alert(decToSex(1234567.89));
</script>

【讨论】:

    【解决方案3】:

    首先将数字拆分为整数和小数部分。

    对于整数部分,取最低有效位的模数,然后除以 60 并重复。

    对于小数部分,反复乘以60,取整数部分,得到结果位数。如果你最终得到零,这不太可能,你就完了。在提取一定数量的数字后,您更有可能想要终止。

    【讨论】:

      【解决方案4】:

      对于它的价值,这里有一个解决方案的修改,可以转换为任何高达 64 的基数:

      // Convert decimal into a base between 2 and 64
      var decToBase = function() {
          var decToBaseMap = [
              '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',
              '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',
              '+', '/'];
      
          return function(number, base) {
      
              if (base < 2 || base > 64) {
                  return "#base should be between 2 and 64#";
              }
      
              var negative = '';
              if (number < 0) {
                  negative = '-';
              }
      
              number = number.toString().split('.');
              var integer = Math.abs(number[0]);
              var fraction = number[1];
              var result = '';
      
              do {
                  result = decToBaseMap[integer % base] + result;
                  integer = parseInt(integer / base, 10);
              } while (integer > 0);
      
              if (fraction) {
                  var decimalPlaces = fraction.toString().length;
                  result += '.';
                  fraction = parseFloat('.' + fraction);
      
                  var x = 0;
                  do {
                      x++;
                      var res = (fraction * base).toString().split('.');
                      result = result + decToBaseMap[res[0]];
      
                      if (res[1]) {
                          fraction = parseFloat('.' + res[1]);
                      }
                      else {
                          break;
                      }
                  } while (x < decimalPlaces);
              }
              return negative + result;
          };
      }();
      
      alert(decToBase(2011, 64)); // displays "VR"
      

      你可以在这里玩它: http://jsfiddle.net/kaicarver/d3Zn2/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-11
        • 2020-10-04
        • 2022-01-14
        • 1970-01-01
        • 2010-10-16
        • 2015-01-26
        相关资源
        最近更新 更多