3

我希望能够在不使用数学的情况下在未知数量的数字中移动小数点 2 位。我知道这看起来很奇怪,但有限的精度会导致一些变化。我的 javascript 不强,但我真的很想学习如何切分一个数字,并在可能的情况下这样做。所以,我希望你们这些了不起的人可以提供帮助。

问题:

  • 575/960 = 0.5989583333333334 使用控制台
  • 我想制作一个副本和可粘贴的百分比,例如:59.89583333333334%
  • 如果我使用数学并乘以 100,由于精度有限,它返回 59.895833333333336

有没有办法让它成为一个字符串,并且总是将小数点向右移动 2 位以跳过数学?

这也是一个小提琴,代码:http: //jsfiddle.net/dandenney/W9fXz/

如果您想知道我为什么需要它并想要精度,这是我制作的这个小工具,用于在不使用计算器的情况下获得响应百分比:http ://responsv.com/flexible-math

4

3 回答 3

4

如果原始数字是这种类型的已知结构并且总是在小数点右侧至少有两位数,您可以这样做:

function makePercentStr(num) {
    var numStr = num + "";
    // if no decimal point, add .00 on end
    if (numStr.indexOf(".") == -1) {
        numStr += ".00";
    } else {
        // make sure there's at least two chars after decimal point
        while (!numStr.match(/\.../)) {
            numStr += "0";        
        }
    }
    return(numStr.replace(/\.(..)/, "$1.")
           .replace(/^0+/, "")    // trim leading zeroes
           .replace(/\.$/, "")    // trim trailing decimals
           .replace(/^$/, "0")    // if empty, add back a single 0
           + "%");
}

使用测试用例进行演示:http: //jsfiddle.net/jfriend00/ZRNuw/

于 2012-04-20T02:24:08.697 回答
1

该问题要求在没有数学的情况下解决问题,但以下解决方案涉及数学。我把它留作参考

function convertToPercentage(num) {
    //Changes the answer to string for checking
    //the number of decimal places.
    var numString = num + '';
    var length = (numString).substring(numString.indexOf(".")+1).length;

    //if the original decimal places is less then
    //no need to display decimals as we are multiplying by 100
    //else remove two decimals from the result
    var precision = (length < 2 ? 0 : length-2);

    //if the number never contained a decimal. 
    //Don't display decimal.
    if(numString.indexOf(".") === -1) {
         precision = 0;   
    }        
    return (num * 100).toFixed(precision) + "%";
}        

在这里使用与接受的答案相同的测试用例工作 jsFiddle

于 2012-04-20T02:54:53.443 回答
0

由于存在浮动错误的风险,我使用了这种方法:

const DECIMAL_SEP = '.';

function toPercent(num) {
  const [integer, decimal] = String(num).split(DECIMAL_SEP);

  // no decimal, just multiply by 100
  if(typeof decimal === 'undefined') {
    return num * 100;
  }

  const length = decimal.length;

  if(length === 1) {
    return Number(integer + decimal + '0');
  }

  if(length === 2) {
    return Number(integer + decimal);
  }

  // more than 2 decimals, we shift the decimal separator by 2
  return Number(integer + decimal.substr(0, 2) + DECIMAL_SEP + decimal.substr(2));
}

console.log(toPercent(10));
console.log(toPercent(1));
console.log(toPercent(0));
console.log(toPercent(0.01));
console.log(toPercent(0.1));
console.log(toPercent(0.12));
console.log(toPercent(0.123));
console.log(toPercent(12.3456));

于 2017-12-13T09:43:13.460 回答