我可以在没有数学的情况下在javascript中移动小数吗?

时间:2012-04-20 02:17:49

标签: javascript decimal

我希望能够在不使用数学的情况下在未知数量的数字上移动小数点2个位置。我知道这看起来很奇怪,但有限的精确度会引起一些变化。我的javascript并不强大,但我真的想学习如何删除一个数字,如果可能的话就这样做。所以,我希望你们有很多人可以提供帮助。

问题:

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

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

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

如果你想知道为什么我需要它并且想要精确度,那就是我用这个小工具来获得响应百分比而不使用计算器:http://responsv.com/flexible-math

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分: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) + "%";
}        

Working jsFiddle此处的测试用例与accepted answer相同。

答案 2 :(得分:0)

我使用此方法是因为存在浮动错误的风险:

&#13;
&#13;
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));
&#13;
&#13;
&#13;